私は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ポインタを作成して、それをパラメータにコピーして、それを動作させるか、それとも何か他のものを使うべきですか?助言がありますか ?前もって感謝します。
あなたはメンバ変数に渡されたパラメータをコピーしますか:
はその後、
Shop::add
は単純に(私がconst
参照に引数の型を変更)として実装することができますか?その場合、割り当てを行う前にポインタを最初にデレファインするだけで十分です: '* sTptr = toAdd'。それとももっと良い: 'sTptr = new shopType(toAdd)'。あなたの意図は明確ではないので、私はこれを答えとして掲示しませんでした。また、エラーが発生しやすいため、C++での手動メモリ管理を避けることを検討してください。ポインターには 'std :: unique_ptr'、可変長配列には' std :: vector'を使用することを検討してください。また、 'new []'の代わりに 'new'で割り当てられたものを' delete [] 'で削除することは、未定義の動作です。 –@AlgirdasPreidžiusこれは学習課題の一部なので、STLを使用することはできません... sTptrは、最後にクッキーの動的配列を指すことを意味します。なぜ、私はdelete []を使用していますか...渡されたパラメータをコピーするのではなく、sTptrが指すダイナミック配列の最初の要素にしたいので、後で追加関数を追加することができます。 – alios
'new shopType;'は配列の割り当てではありません。 'delete []'でそれを解放することは、未定義の動作です。 2番目の見方では、配列にすでに要素が含まれている場合は、 'sTptr [noi ++] = toAdd;'でコピーしますが、最初の要素の場合にはコピーしたくないと言っています。私は混乱します。 –