2017-05-12 13 views
0

私はShopテンプレートクラスとCookieクラスを持っていて、Cookieの種類(またはそれがテンプレートなので種類が多種)の動的配列を作成しようとしています。オブジェクトをテンプレートコンストラクタまたはメソッドに渡す正しい方法は何ですか

template<typename shopType> 
Shop<shopType>::Shop(shopType & sT) 
{ 
    sTptr = new shopType; 
    sTptr = sT;       // not allowed, how can I fix ? 
    noi = 1; 
    totalcost = sT.getCost(); 
} 

template<typename shopType> 
void Shop<shopType>::add(shopType & toAdd) 
{ 
    if (noi == 0) { 
     sTptr = new shopType; 
     sTptr = toAdd;     // not allowed, how can I fix ? 
     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(); 
    } 
} 
:私は次のように書いたコンストラクタとメソッドで

template <typename shopType> 
class Shop { 
private: 
    int noi;     // number of items 
    double totalcost; 
    shopType * sTptr;  // for dynamic array 
public: 
    Shop(shopType &); 
    void add(shopType &); 
    ..... 

int main() { 
..... 
    Cookie cookie1("Chocolate Chip Cookies", 10, 180); 
    Cookie cookie2("Cake Mix Cookies", 16, 210); 

    Shop<Cookie> cookieShop(cookie1);  // getting error here 
    cookieShop.add(cookie2);    // and here 
..... 

次のような私の主な機能には次のように必要に応じてさらに追加0

と私は自然にC2440「=」取得しています:「クッキー*」エラーに「クッキー」から変換することはできませんが...

私は私が間違っているのか理解が、私はどのようにそれを把握することはできません正しい方法でそれを行うには...

新しいCookieポインタを作成して、それをパラメータにコピーして、それを動作させるか、それとも何か他のものを使うべきですか?助言がありますか ?前もって感謝します。

+1

あなたはメンバ変数に渡されたパラメータをコピーしますか:

template <typename shopType> class Shop { private: // There is no need for this. // int noi; // number of items double totalcost; std::vector<shopType> shopItems; // ... }; 

はその後、Shop::addは単純に(私がconst参照に引数の型を変更)として実装することができますか?その場合、割り当てを行う前にポインタを最初にデレファインするだけで十分です: '* sTptr = toAdd'。それとももっと良い: 'sTptr = new shopType(toAdd)'。あなたの意図は明確ではないので、私はこれを答えとして掲示しませんでした。また、エラーが発生しやすいため、C++での手動メモリ管理を避けることを検討してください。ポインターには 'std :: unique_ptr'、可変長配列には' std :: vector'を使用することを検討してください。また、 'new []'の代わりに 'new'で割り当てられたものを' delete [] 'で削除することは、未定義の動作です。 –

+0

@AlgirdasPreidžiusこれは学習課題の一​​部なので、STLを使用することはできません... sTptrは、最後にクッキーの動的配列を指すことを意味します。なぜ、私はdelete []を使用していますか...渡されたパラメータをコピーするのではなく、sTptrが指すダイナミック配列の最初の要素にしたいので、後で追加関数を追加することができます。 – alios

+0

'new shopType;'は配列の割り当てではありません。 'delete []'でそれを解放することは、未定義の動作です。 2番目の見方では、配列にすでに要素が含まれている場合は、 'sTptr [noi ++] = toAdd;'でコピーしますが、最初の要素の場合にはコピーしたくないと言っています。私は混乱します。 –

答えて

3

コンパイラからのエラーメッセージはかなり明確です。あなたは、配列のために自分自身をメモリを管理するための非常に強力な理由がある場合を除き、

sTptr = toAdd; 

Shopにオブジェクトを格納するためにstd::vectorを使用して:あなたはラインでshopType*からshopTypeを割り当てようとしています。

template<typename shopType> 
void Shop<shopType>::add(shopType const& toAdd) 
{ 
    shopItems.push_back(toAdd); 
} 
+0

STLは本当に時間を節約できますが、STLを使用せずに実装する予定でした。とにかく、私はベクトルに切り替えて、上記の例のように実装しました。 – alios

関連する問題