C++ LNK1120类错误(工厂模式)。不知道它在哪里';他来自哪里
对不起,如果我发布了太多的代码。我真的不知道链接错误是从哪里来的。这条线路似乎有问题:C++ LNK1120类错误(工厂模式)。不知道它在哪里';他来自哪里,c++,factory-pattern,C++,Factory Pattern,对不起,如果我发布了太多的代码。我真的不知道链接错误是从哪里来的。这条线路似乎有问题: dough = ingredientFactory->createDough(); 在CheesePizza类中,但我不知道IngreditFactory引用是否存在问题,也不知道面团类中是否存在问题。谁能告诉我为什么它不能链接?(我得到一个LNK1120错误)。任何帮助都将不胜感激 谢谢 class Dough { string m_dough; public: Dough()
dough = ingredientFactory->createDough();
在CheesePizza类中,但我不知道IngreditFactory引用是否存在问题,也不知道面团类中是否存在问题。谁能告诉我为什么它不能链接?(我得到一个LNK1120错误)。任何帮助都将不胜感激
谢谢
class Dough
{
string m_dough;
public:
Dough() : m_dough( "Unknown dough" ) {};
string setDough( string dough ) { m_dough = dough; };
string getDough() { return m_dough; };
};
class ThinCrustDough : public Dough
{
public:
ThinCrustDough() { setDough( "Thin crust dough" ); };
};
class PizzaIngredientFactory
{
public:
PizzaIngredientFactory() {};
Dough *createDough();
Sauce createSauce();
Cheese *createCheese();
};
class NYPizzaIngredientFactory : public PizzaIngredientFactory
{
Cheese *cheese;
public:
NYPizzaIngredientFactory(){};
Dough *createDough() { return new ThinCrustDough; };
Sauce *createSauce() { return new MarinaraSauce; };
Cheese *createCheese() { return new ReggianoCheese; };
};
class Pizza
{
string m_size;
string m_description;
string m_type;
PizzaIngredientFactory *ingredientFactory;
string m_name;
string m_dough;
string m_sauce;
string m_cheese;
Dough dough;
Sauce sauce;
Cheese cheese;
public:
Pizza() : m_description("Unknown Pizza"), m_size(" ,Unknown Size ") {};
Pizza( PizzaIngredientFactory *ingredientFactory ){ this->ingredientFactory = ingredientFactory; };
string name() { return m_name; };
string getName() { return m_name; };
void setName( string name ) { m_name = name; };
string getDescription() { return m_description; };
string setDescription( string setdescription ) { return m_description = setdescription; };
string getSize() { return m_size; };
string setSize( string setsize ) { return m_size = setsize; };
string getType() { return m_type; };
string setType( string settype ) { return m_type = settype; };
virtual void prepare() = 0;
void bake();
void cut();
void box();
void orderPizza();
};
void Pizza::prepare()
{
Pizza *pizza;
cout << "Preparing " << pizza->getName() << endl;
cout << "Adding toppings : " << endl;
for ( vector<string>::iterator itr = toppings.begin();
itr != toppings.end();
++itr )
{
cout << " " << *itr;
}
};
void Pizza::bake()
{
cout << "Bake for 25 minutes at 350 degrees" << endl;
};
void Pizza::cut()
{
cout << "Cutting the pizza into diagonal slices" << endl;
};
void Pizza::box()
{
cout << "Place pizza in official PizzaStore box" << endl;
};
class CheesePizza : public Pizza
{
PizzaIngredientFactory *ingredientFactory;
Pizza *pizza;
Dough dough;
Sauce *sauce;
Cheese *cheese;
public:
CheesePizza() { };
CheesePizza( PizzaIngredientFactory *ingredientFactory ){ this->ingredientFactory = ingredientFactory; };
void prepare(){
cout << "Preparing " << getName() << endl;
dough = ingredientFactory->createDough();
}; ;
};
class PizzaStore
{
PizzaIngredientFactory *factory;
public:
PizzaStore() {};
PizzaStore( PizzaIngredientFactory *factory ) { this->factory = factory; };
Pizza *orderPizza( string type )
{
Pizza *pizza;
pizza = createPizza( type );
pizza->prepare();
pizza->bake();
pizza->cut();
pizza->box();
return pizza;
}
protected:
virtual Pizza *createPizza( string type ) = 0;
};
class NYPizzaStore : public PizzaStore
{
Pizza *pizza;
public:
NYPizzaStore() {};
NYPizzaStore( Pizza *pizza ){ this->pizza = pizza; };
protected:
Pizza *createPizza( string item )
{
Pizza *pizza = NULL;
PizzaIngredientFactory *ingredientFactory = new NYPizzaIngredientFactory;
string type = "New York Style";
string cheese = "cheese";
if ( strcmp( cheese.c_str(), item.c_str() ) == 0 )
{
pizza = new CheesePizza( ingredientFactory );
pizza->setType( type + " Cheese Pizza" );
}
return pizza;
}
};
class
{
生面团;
公众:
面团():m_面团(“未知面团”){};
线状面团(线状面团){m_面团=面团;};
字符串getruam(){return m_ruam;};
};
类thincrustRuam:公共面团
{
公众:
薄面团({setruum(“薄皮面团”);};
};
类别PizzaIngredientFactory
{
公众:
PizzaIngredientFactory(){};
面团*create面团();
沙司();
奶酪*createCheese();
};
NYPizzaIngredientFactory类:公共PizzaIngredientFactory
{
奶酪*奶酪;
公众:
NYPizzaIngredientFactory(){};
面团*CreateRough(){返回新的thincrustRough;};
Sauce*createSauce(){返回新的MarinaraSauce;};
Cheese*createCheese(){返回新的ReggianoCheese;};
};
高级披萨
{
字符串m_大小;
字符串m_描述;
字符串m_类型;
PizzaIngredientFactory*ingredientFactory;
字符串m_name;
生面团;
串酱汁;
串奶酪;
面团;
酱汁;
奶酪;
公众:
比萨饼():m_描述(“未知比萨饼”),m_大小(“未知大小”){};
比萨饼(PizzaIngredientFactory*ingredientFactory){this->ingredientFactory=ingredientFactory;};
字符串名称(){return m_name;};
字符串getName(){return m_name;};
void setName(字符串名){m_name=name;};
字符串getDescription(){return m_description;};
string setDescription(string setDescription){return m_description=setDescription;};
字符串getSize(){return m_size;};
字符串设置大小(字符串设置大小){return m_size=setSize;};
字符串getType(){return m_type;};
string setType(string setType){return m_type=setType;};
虚空准备()=0;
void bake();
空切();
空盒();
无效命令();
};
void Pizza::prepare()
{
披萨*披萨;
cout(如果我没记错的话,这来自Head First:Design patterns,c++-ized)
您的问题是您在PizzaIngredientFactory中声明了一些函数
但您尚未定义它们,导致链接器发出错误消息。您可以通过查看错误来确定原因。visual studio链接器将在消息中列出它们。
您可以通过在PizzaIngredientFactory
中将这些函数声明为虚拟来解决此问题。正如Joachim Pileborg所建议的,纯虚拟优于“普通”虚拟,因为这种模式是抽象工厂。
另一件值得注意的事情是,为继承而设计的类应该有一个虚拟析构函数(但它也必须在基类中定义,否则会发生另一个链接器错误)ce
不同于PizzaIngredientFactory
和NYPizzaIngredientFactory
。为了一致性,我会把这个->
放在面团前面,我不会。为了一致性,我会删除所有这个->
@VJovic,这只是一个风格问题。据我所见,他在其他地方都使用这个->
,因此,他不妨将其添加到那里(就个人而言,我从不使用this
,除非我在方法调用中将其作为参数传递)