2016-05-14 1 views
1

私は動的に割り当てられたメモリを使うという宿題があります。私の教授は私にいくつかの指示をしました。それらを使用して、私は以下のコードをコード化しました。ランダムな時間にエラーが発生しています。コピー実行前にエラーが表示されることがあります。時には1つのオブジェクトをコピーし、次のものをコピーしないでください。私が間違っていることを理解していない。以下動的にメモリを割り当て、コピーコンストラクタでエラーが発生する

デフォルトコンストラクタ

GroceryItem::GroceryItem() 
{ 
    item_name = new char[strlen("") + 1]; 
    strcpy(item_name, ""); 
    item_price = 0; 
    qty_on_hand = 0; 
    qty_purchased = 0; 
}; 

機能は、私は2つのオブジェクトをコピーするのに使用コピーコンストラクタです:

以下
GroceryItem::GroceryItem(const GroceryItem& Grocery_in) 
{ 
    item_name = new char[strlen(Grocery_in.item_name) + 1]; 
    strcpy(item_name, Grocery_in.item_name); 
    item_price = Grocery_in.item_price; 
    qty_on_hand = Grocery_in.qty_on_hand; 
    qty_purchased = Grocery_in.qty_purchased; 
} 
; 

がassigment opperatorある

GroceryItem& GroceryItem::operator=(GroceryItem& copy_item) 
{ 
    if (this == &copy_item) 
     return *this; 
    else 
    { 
     delete[] item_name; 
     item_name = new char[strlen(copy_item.item_name)+1]; 
     strcpy(item_name, copy_item.item_name); 
     item_price = copy_item.item_price; 
     qty_on_hand = copy_item.qty_on_hand; 
     qty_purchased = copy_item.qty_purchased; 
     return *this ;  // They are the same 
    } 
} 

は場合は、以下の機能から呼び出し私はtemp2にコピーしようとします:

ここで
void sort_items(GroceryItem ini_customer_GroceryItem[], int number) 
{ 
    int j = 0, k = 0; 
    GroceryItem temp2; 

    for (j = 0; j < number - 1; j++) // n-1 passes 
    { 
     for (k = number - 1; j < k; k--) // each pass runs one fewer than the preceding one 
     { 
      if (ini_customer_GroceryItem[k - 1] > ini_customer_GroceryItem[k]) 
      { 
       temp2 = ini_customer_GroceryItem[k - 1]; 
       ini_customer_GroceryItem[k - 1] = ini_customer_GroceryItem[k]; 
       ini_customer_GroceryItem[k] = temp2; 
      } 
     } 
    } 
} 

210は、エラー

あるimage

+1

あなたの教授はあなたと廃止されたCコードを書くためにあなたを指示することにより、ひどい仕打ちをしていますstrcpy()とstrlen()の代わりに 'std :: string'のような実際のC++コードを教える時間を費やすのではなく、このナンセンスを必要としません。熟練したC++開発者になるために必要なスキルを教えられているわけではありません。 P.S.私はコピーコンストラクタに間違いはないと思う。おそらく、メモリ破損は他の場所で発生します。あなたのコードがある特定の場所、つまりコピーコンストラクタでクラッシュしたからといって、そのバグがどこにあるのかを意味するわけではありません。 [mcve]を投稿してください。 –

+0

これはコピーコンストラクタではなく、代入演算子であり、const参照でその引数を取るべきです。 –

+0

"以下の関数はコピーコンストラクタです" - 実際は代入演算子です。あなたのコピーコンストラクタはどこですか? –

答えて

1

代わりにコピーのstd::swap()アルゴリズムを使用する必要がありますあなたのsort_items()機能オブジェクトを手動:

/* 
temp2 = ini_customer_GroceryItem[k - 1]; 
ini_customer_GroceryItem[k - 1] = ini_customer_GroceryItem[k]; 
ini_customer_GroceryItem[k] = temp2; 
*/ 
std::swap(ini_customer_GroceryItem[k - 1], ini_customer_GroceryItem[k]); 

いずれかの方法で、あなたはコピーを実装していませんでしたコンストラクタコピー代入演算子(実装ではcopy_itemconstである必要があります)。 Rule of Threeを参照してください。

GroceryItem::GroceryItem(const GroceryItem& source_item) 
{ 
    item_name = new char[strlen(source_item.item_name)+1]; 
    strcpy(item_name, source_item.item_name); 
    item_price = source_item.item_price; 
    qty_on_hand = source_item.qty_on_hand; 
    qty_purchased = source_item.qty_purchased; 
} 

そして、あなたはコピーコンストラクタを使用して、コピー代入演算子を実装することができます:あなたは、適切なコピーコンストラクタを実装する必要が

に簡略化することができ
GroceryItem& GroceryItem::operator=(const GroceryItem& copy_item) 
{ 
    if (this != &copy_item) 
    { 
     GroceryItem temp(copy_item); 
     std::swap(temp, *this); 
    } 
    return *this; 
} 

GroceryItem& GroceryItem::operator=(GroceryItem copy_item) 
{ 
    std::swap(copy_item, *this); 
    return *this; 
} 

もちろん、まだデストラクタを実装していない場合は、デストラクタを忘れないでください。

GroceryItem::~GroceryItem() 
{ 
    delete[] item_name; 
} 

operator>()はもちろん、sort_items()は1つを予定しています。

さて、あなたは代わりにchar*std::stringすべきitem_nameメンバーを変更する場合には、すべての言って、手動でデストラクタ、コピーコンストラクタを実装する必要はありません、またはすべての代入演算子をコピーする(単にデフォルト数値メンバーをゼロ初期化するためのコンストラクタ)。コンパイラのデフォルトは、コピーコンストラクタをデストラクタの実装を生成し、代入演算子は、あなたのためのデータメンバのすべてを管理するための十分ですコピーします。

class GroceryItem 
{ 
public: 
    std::string item_name; 
    float item_price; 
    int qty_on_hand; 
    int qty_purchased; 

    GroceryItem(); 

    bool operator > (const GroceryItem& item) const; 
}; 

GroceryItem::GroceryItem() 
{ 
    item_price = 0.0f; 
    qty_on_hand = 0; 
    qty_purchased = 0; 
}; 

bool GroceryItem::operator > (const GroceryItem& item) const 
{ 
    return ...; 
} 

void sort_items(GroceryItem ini_customer_GroceryItem[], int number) 
{ 
    int j = 0, k = 0; 
    //GroceryItem temp2; 

    for (j = 0; j < number - 1; j++) // n-1 passes 
    { 
     for (k = number - 1; j < k; k--) // each pass runs one fewer than the preceding one 
     { 
      if (ini_customer_GroceryItem[k - 1] > ini_customer_GroceryItem[k]) 
      { 
       /* 
       temp2 = ini_customer_GroceryItem[k - 1]; 
       ini_customer_GroceryItem[k - 1] = ini_customer_GroceryItem[k]; 
       ini_customer_GroceryItem[k] = temp2; 
       */ 
       std::swap(ini_customer_GroceryItem[k - 1], ini_customer_GroceryItem[k]); 
      } 
     } 
    } 
} 
+0

あなたのコメントよりも、私のコードを変更して、それがうまくいくかどうかを確認します。 (!この=&copy_item) { GroceryItemの一時(copy_item)場合 – kolotei

+0

はcharのコードでいくつかの問題、 'GroceryItem&GroceryItem ::演算子=(constのGroceryItem&copy_item)は { が見つかりました。 std :: swap(temp、* this); } return * this; } ' – kolotei

+0

あなたは何の問題を見ていますか? –

関連する問題