2017-05-12 8 views
0

C++でOOP用の「Candy Shop」割り当てプロジェクトに取り組んでいて、コンパイラが自分のコードについて再度不満を抱いています:)フォーラムでも同様の名前のトピックが見つかりましたが、私が持っている...だから、次のように私はいくつかの製品(キャンディー、クッキー、対)、ショッピングクラス用のテンプレートを導き出すために、基本クラスを得た:派生したオブジェクトをテンプレートに渡す

class productBase{ 
protected: 
    string name; 
    double amount; 
    double ppAmount; 
public: 
    productBase(){} 
    productBase(string na, double am, double pp){ 
     name = na; 
     amount = am; 
     ppAmount = pp; 
    }  
    string getName() const; 
    double getAmount() const; 
    double getppAmount() const; 
    //virtual double getCost() const = 0;  // make it abstract ? 
}; 

// Templete for shopping 
template <typename shopType> 
class Shop { 
private: 
    int noi;      // number of items 
    double totalcost; 
    shopType * sTptr; 
public: 
    Shop(); 
    Shop(shopType); 
    ~Shop() { delete[] sTptr; } 

    void add(shopType &); 
    void setDiscount(const double);  
    friend ostream& operator<<(ostream&, const Shop<shopType> &);  
    shopType operator[](int); 
}; 

そして、私の製品クラスの一つは、このようなものです:

class Cookie: public productBase { 
private: 
    const double taxRate; 
public: 
    Cookie() :taxRate(8) {} 
    Cookie(string nm, double am, double pp) :productBase(nm, am, pp), taxRate(8) {} 
    ~Cookie() {}  
    double getCost() const;  
    friend ostream& operator<<(ostream &, Cookie &);  
}; 

プログラムでは、最初に作成されたダイナミックアレイで製品を保持する必要があります次のようにi番目の新しいインスタンスを追加:

私はコンパイラ

エラーLNK2019未解決の外部シンボル「パブリック:__thiscallショップ::ショップ(クラスクッキー)」からのエラーを取得しています

int main() { ..... Cookie cookie1("Chocolate Chip Cookies", 10, 180); Cookie cookie2("Cake Mix Cookies", 16, 210); Shop<Cookie> cookieShop(cookie1); // << this is where I am gettin error cookieShop.add(cookie2); ..... 

と、この(?? 0?$ Shop @ VCookie @@@@ QAE @ VCookie @@@ Z)は、関数_mainで参照されています

私はテンプレートのコンストラクタに起因すると思っています。参照渡しとベースクラスのポインタを使用するか、まったく基本クラスを使用しないでも、私は問題がsometのように感じる何かの欠落しているパラメータまたは誤用のような他の興が、したがって、これらは私が原因を探しています私のテンプレートクラスのメソッドです:(それを把握することはできません...

template<typename shopType> 
Shop<shopType>::Shop() 
{ 
    noi = 0; 
    totalcost = 0; 
    sTptr = NULL; 
} 

template<typename shopType> 
Shop<shopType>::Shop(shopType sT)   // I guess the problem is here 
{ 
    sTptr = sT; 
    noi++; 
    totalcost = sT.getCost();  
} 

template<typename shopType> 
void Shop<shopType>::add(shopType & toAdd) 
{ 
    if (noi == 0) { 
     sTptr = new shopType; 
     sTptr = toAdd; 
     totalcost = toAdd.getCost(); 
     noi++; 
    } 
    else { 
     shopType * ptr = new shopType[noi + 1]; 
     for (int a = 0; a < noi; a++) { 
      ptr[a] = sTptr[a]; 
     }  
     delete[] sTptr;   
     sTptr = ptr; 
     sTptr[noi++] = toAdd; 
     totalcost += toAdd.getCost(); 
    } 
} 

このテンプレートの使用が混乱しています私。私はすでにそれを使用せずに済むでしょうが、私はそれをもう一度学ぶ必要があります:) どうして私は見えなくなったのでしょうか?

事前にガイダンスや援助をお寄せいただきありがとうございます。

+0

はい、テンプレートのメソッドは、基本クラスとテンプレートクラス定義を持つshop.hファイル(#include "shop.h")を含む別のshop.cppファイルにあります。 – alios

答えて

1
template<typename shopType> 
Shop<shopType>::Shop(shopType sT)   // I guess the problem is here 
{ 
    sTptr = sT; 
    noi++; 
    totalcost = sT.getCost();  
} 

値でオブジェクトを渡し、そのオブジェクトをその型へのポインタに割り当てます。それはどのタイプにも有効ではありません。ここのロジックはaddと似ているはずです。

+0

と書かれたコンストラクタが無効で、その特定のインスタンス化のために提供されていないので、エラーは未解決のシンボルについて不平を言っていますか? 'shopTpye'型がポインタ変換に何らかのオブジェクトを提供していない限り、どんなインスタンス化でも有効ではありませんが、そうでなければ私はエラーを説明できません。 – user463035818

+0

@ tobi303 - 私は十分にエラーを読みませんでした。複製されたNathanリンクには解決策があります。私はこれをここに残しましたので、OPは再び失敗したとき何が間違っているかを知っています。私はそれが質問に答えていないことを知っています:) – StoryTeller

+0

私はそれについて疑いがあり、それを実装しようとしましたが、@ NathanOliverが指摘した問題はコンパイルプロセス全体を台無しにしていたと指摘しました。しかし、ヘッダーファイルへの宣言の削除を修正した後、そこに問題に直面する必要があります。 – alios

関連する問題