이 코드의 문제점을 잘 모르지만 Builder pattern을 배우고 있습니다. 예제 코드는 Java에 있으며 C++에서 동일한 코드를 작성하려고하는데 링커 오류가 발생합니다. 나는 그것에 대해 모두 검색하고 읽었으며 여전히 올바른 방법을 찾지 못했고 여기에 그것을 게시했습니다. 정말로 사소한 것을 놓치고 있다면 사과드립니다. 의견에 따라가상 함수 링커 오류 C++
#include <iostream>
#include <string>
#include <list>
#include <memory>
#include <conio.h>
using namespace std;
using std::string;
using std::unique_ptr;
using std::list;
class Packing
{
public:
virtual string pack() = 0;
};
template<typename T>
class Item
{
public:
virtual string name();
virtual Packing* packing();
virtual float price();
};
/*
As per comments, I have now defined the functions in my Item class, but
the actual definition is in the derived classes and because of these
definitions, I am not getting the actual output. I have provided the
required and actual output of this code.
I also read about CRTP and have incorporated those changes as well. But
still am not able to figure out how to get Items in the list.
*/
template<typename T>
string Item<T>::name()
{
return "Item Class";
}
template<typename T>
Packing* Item<T>::packing()
{
return (nullptr);
}
template<typename T>
float Item<T>::price()
{
return 0.0f;
}
class Wrapper : public Packing
{
public:
string pack() override
{
return "Wrapper";
}
};
class Bottle : public Packing
{
public:
string pack() override
{
return "Bottle";
}
};
class Burger : public Item<Burger>
{
public:
Packing* packing() override;
};
Packing* Burger::packing()
{
return (new Wrapper());
}
class ColdDrink : public Item<ColdDrink>
{
public:
Packing* packing() override;
};
Packing* ColdDrink::packing()
{
return (new Bottle());
}
class VegBurger : public Burger
{
public:
float price() override
{
return 25.0f;
}
string name() override
{
return "Veg Burger";
}
};
class ChickenBurger : public Burger
{
public:
float price() override
{
return 50.5f;
}
string name() override
{
return "Chicken Burger";
}
};
class Coke : public Burger
{
public:
float price() override
{
return 30.0f;
}
string name() override
{
return "Coke";
}
};
class Pepsi : public Burger
{
public:
float price() override
{
return 35.0f;
}
string name() override
{
return "Pepsi";
}
};
class Meal
{
public:
Meal() {}
void addItem(Item& item) // This is the error place after changing my
// code to use templates. The error is:
// 1>c:\users\xxx\documents\visual studio
//2015\projects\mealbuilder\mealbuilder\mealbuilder.h(14):
// error C2955: 'Item': use of class template
// requires template argument list
{
items.push_back(std::move(item));
}
float getCost()
{
float cost = 0.0f;
for (auto& item : items)
{
cost += item.price();
}
return cost;
}
void showItems()
{
for (auto& item : items)
{
cout << "Item : " << item.name() << endl;
cout << "Packing : " << item.packing() << endl;
cout << "Price : " << item.price() << endl << endl;
}
}
private:
list<Item> items;
};
class MealBuilder
{
public:
Meal prepareVegMeal()
{
Meal meal;
VegBurger vegBurger;
Coke coke;
meal.addItem(vegBurger);
meal.addItem(coke);
return meal;
}
Meal prepareNonVegMeal()
{
Meal meal;
ChickenBurger chickenBurger;
Pepsi pepsi;
meal.addItem(chickenBurger);
meal.addItem(pepsi);
return meal;
}
};
int main()
{
MealBuilder mealBuilder;
Meal vegMeal = mealBuilder.prepareVegMeal();
cout << "Veg Meal: " << endl;
vegMeal.showItems();
cout << "Total cost: " << vegMeal.getCost();
Meal nonVegMeal = mealBuilder.prepareNonVegMeal();
cout << "Non-Veg Meal: " << endl;
nonVegMeal.showItems();
cout << "Total cost: " << nonVegMeal.getCost();
_getch();
return 0;
}
, 여기에 내가 전에 Item 클래스의 정의 추가에 도착하는 데 사용되는 오류입니다 :
: 정의를 추가 한 후1>------ Build started: Project: MealBuilder, Configuration: Debug Win32 ------
1> MealBuilder.cpp
1>MealBuilder.obj : error LNK2001: unresolved external symbol "public:
virtual class std::basic_string<char,struct std::char_traits<char>,class
std::allocator<char> > __thiscall Item::name(void)" ([email protected]@@UAE?AV?
[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@XZ)
1>MealBuilder.obj : error LNK2001: unresolved external symbol "public:
virtual class Packing * __thiscall Item::packing(void)" (?
[email protected]@@[email protected]@XZ)
1>MealBuilder.obj : error LNK2001: unresolved external symbol "public:
virtual float __thiscall Item::price(void)" ([email protected]@@UAEMXZ)
1>C:\Users\XXX\documents\visual studio
2015\Projects\MealBuilder\Debug\MealBuilder.exe : fatal error LNK1120: 3
unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
, 나는 다음과 같은 출력을 얻을
Veg Meal:
Item : Item Class
Packing : 00000000
Price : 0
Item : Item Class
Packing : 00000000
Price : 0
Total cost: 0
Non-Veg Meal:
Item : Item Class
Packing : 00000000
Price : 0
Item : Item Class
Packing : 00000000
Price : 0
Total cost: 0
그러나 필요한 출력은 다음과 같습니다
Veg Meal
Item : Veg Burger, Packing : Wrapper, Price : 25.0
Item : Coke, Packing : Bottle, Price : 30.0
Total Cost: 55.0
Non-Veg Meal
Item : Chicken Burger, Packing : Wrapper, Price : 50.5
Item : Pepsi, Packing : Bottle, Price : 35.0
Total Cost: 85.5
필요한 출력을 얻기 위해 코드를 변경하는 방법을 모르겠습니다. 도와주세요.
미리 감사드립니다.
왜 링커 오류를 질문에 복사하지 않습니까? 하지만 먼저 링커 오류가 발생하는 동안 프로그램을 훨씬 짧게 만들 수 있습니다. –
오류 코드를 알려주십시오. – teivaz
그리고 btw. 'Item' 클래스의 멤버 함수 정의는 어디에 있습니까? – teivaz