Προς το περιεχόμενο

C++ Factory Pattern


Προτεινόμενες αναρτήσεις

Δημοσ.

Γειά σας φίλοι, θα ήθελα λίγο να με βοηθήσετε στον κώδικα C++ διότι τώρα μαθαίνω και είμαι λίγο άσχετος. Έχω μια Factory Design Pattern και δεν μπορώ να την κουμαντάρω.

 

>
#include <stdio.h>

class Computer
{
protected:
int price;

public:
int GetPrice()
{
	return price;
}
};

class Desktop : public Computer
{
public:
Desktop()
{
	this->price = 500;
}
};

class Laptop : public Computer
{
public:
Laptop()
{
	this->price = 800;
}
};

class ComputerFactory
{
public:
enum ComputerType
{
	Desktop, Laptop
};

static Computer *Create(ComputerType computerType)
{
	switch (computerType)
	{
		case Desktop:
			return new Desktop();
		case Laptop:
			return new Laptop();
	}
}

static void Information(ComputerType computerType)
{
	Computer *computer = Create(computerType);
	printf("Computer price (%d)", computer->GetPrice());
}
};

int main()
{
ComputerFactory::Information(ComputerFactory::Desktop);
ComputerFactory::Information(ComputerFactory::Laptop);
getchar();
return 0;
}

 

Το πρόβλημα είναι:

1>d:\programming\designpatterns\factory\factory\main.cpp(46): error C2061: syntax error : identifier 'Desktop'

1>d:\programming\designpatterns\factory\factory\main.cpp(48): error C2061: syntax error : identifier 'Laptop'

========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

 

Ευχαριστώ.

Δημοσ.

Υπάρχουν δύο προβλήματα με τον κώδικα σου. Αρχικά οι κλάσεις σου έχουν ίδια ονόματα με τις τιμές του enumeration. Κι επειδή όλα βρίσκονται στο ίδιο namespace υπάρχουν conflicts.

Αν δε θες να αλλάξεις τις τιμές, μπορείς να αναφερθείς στους constructros των κλάσεων Laptop κ Desktop με τον operator ::

 

>
return new ::Desktop;

 

O τελεστής :: αναφέρεται στο scope που βρίσκεται έξω από το scope μέσα στο οποίο τον γράφεις.

 

 

Το δεύτερο πρόβλημα είναι στον τρόπο που καλείς τον default constructor, που στη C++ γίνεται με τον εξής τρόπο: Foo = new Foo; (χωρίς παρενθέσεις δηλαδή). Σε πολλούς compilers δημιουργείται πρόβλημα γιατί αντί να ψάχνουν να βρουν κάποιον default constructor ψάχνουν για συνάρτηση, στο παράδειγμα μας την Foo(void). Μπορεί κάποιος compiler να το δεχθεί, αλλά δεν είναι portable.

Δημοσ.

O τελεστής :: αναφέρεται στο scope που βρίσκεται έξω από το scope μέσα στο οποίο τον γράφεις.

 

Ο τελεστής :: σκέτος αναφέρεται στο global namespace (όχι scope), όχι στο αμέσως εξωτερικό (υποτίθεται πως ξέρεις σε ποιο namespace βρίσκεσαι κάθε φορά οπότε αν χρειαστεί μπορείς να γράψεις το όνομά του κανονικά).

 

@soulcon: Δεν ξέρω αν σε ενδιαφέρει (αν έγραψες τον κώδικα μόνο για εξάσκηση σε κάτι συγκεκριμένο δε θα πρέπει να σε ενδιαφέρει) αλλά δημιουργείς αντικείμενα και δεν τα κάνεις destroy => το πρόγραμμά σου έχει memory leaks.

Δημοσ.

@soulcon: Δεν ξέρω αν σε ενδιαφέρει (αν έγραψες τον κώδικα μόνο για εξάσκηση σε κάτι συγκεκριμένο δε θα πρέπει να σε ενδιαφέρει) αλλά δημιουργείς αντικείμενα και δεν τα κάνεις destroy => το πρόγραμμά σου έχει memory leaks.

 

Για εξάσκηση το έγραψα, ευχαριστώ για το tip. :)

Δημοσ.

Το δεύτερο πρόβλημα είναι στον τρόπο που καλείς τον default constructor, που στη C++ γίνεται με τον εξής τρόπο: Foo = new Foo; (χωρίς παρενθέσεις δηλαδή). Σε πολλούς compilers δημιουργείται πρόβλημα γιατί αντί να ψάχνουν να βρουν κάποιον default constructor ψάχνουν για συνάρτηση, στο παράδειγμα μας την Foo(void). Μπορεί κάποιος compiler να το δεχθεί, αλλά δεν είναι portable.

 

Κανονικά κανένας compiler δεν θα πρέπει να το δεχθεί, στην C++ είναι απλώς το δεύτερο που λες, δηλαδή η σύνταξη με τις () υποννοεί συνάρτηση.

Επειδή στην Java η κλήση του default constructor γίνεται με παρενθέσεις, δεν σημαίνει ότι γίνεται το ίδιο και στην C++...

 

http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.2

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...