私は C++ クラスの宿題に取り組んでいますが、いくつかの問題があります。item::operator= によって呼び出される item::name() の「サイズ 8 の初期化されていない値の使用」と「サイズ 8 の無効な読み取り」が原因で、私のプログラムはセグメンテーション違反を起こしています。
#ifndef ITEM_H
#define ITEM_H
const double WEIGHT_DEFAULT = 1.0;
const int ITEM_NAME_LENGTH = 30;
class item {
public:
// Constructors and deconstructor
item();
item(char* nme, double weight);
virtual ~item();
// Copy constructor
item(const item& itm);
// Overload assignment operator
const item& operator=(const item& itm);
// Overload inequality operator
bool operator!=(const item&) const;
// Mutators and accessors
const char* name(void) const;
double weight(void) const;
void weight(double wght);
void name(char* nme);
protected:
private:
char* m_name;
double m_weight;
};
#endif // ITEM_H
問題があると思われる実装の部分を次に示します。
...
const item& item::operator=(const item& itm)
{
if (strcmp(this->name(), itm.name()) != 0)
{
this->weight(itm.weight());
strcpy(m_name, itm.name());
}
return *this;
}
const char* item::name(void) const {
return m_name;
}
...
ご覧のとおり、割り当ての一部は c-strings を使用することであるため、私は面倒な詳細で立ち往生しています。ポインターとクラスについての私の理解では、両方を使用する場合、デストラクタを実装し、コンストラクタをコピーし、代入演算子をオーバーロードする必要があります。上記のすべてを実行しました。Stack Overflow でコピー アンド スワップ イディオムに関する情報をいくつか見て、それを実装しようとしましたが、コードで動作させることもできませんでした。
私の脳は、どこが間違っていたのかを突き止めようとして混乱しています。誰かが私に欠けているものを教えてもらえますか?
ありがとう!
編集
コンストラクタ、デストラクタなどは次のとおりです。
item::item() {
//ctor
m_name = new char[ITEM_NAME_LENGTH];
strncpy(m_name, " ", ITEM_NAME_LENGTH - 1);
this->weight(WEIGHT_DEFAULT);
return;
}
item::item(char* nme, double wght) {
m_name = new char[ITEM_NAME_LENGTH];
strncpy(m_name, nme, ITEM_NAME_LENGTH - 1);
// We want to check for a rational value being
// passed in to weight. In theory, an item has
// to have *some* kind of weight, so we check
// for a weight of 0. If a weight of 0 has been passed in,
// we instead initialize the item's weight to the
// default weight (set in the header file).
if (wght > 0.0) {
this->weight(wght);
} else {
this->weight(WEIGHT_DEFAULT);
}
return;
}
item::~item() {
//dtor
// TODO: We need to clean up any variables here.
delete[] m_name;
}
item::item(const item& itm) {
// copy ctor
this->weight(itm.weight());
strncpy(m_name, itm.name(), ITEM_NAME_LENGTH - 1);
}
const item& item::operator=(const item& itm)
{
if (strcmp(this->name(), itm.name()) != 0)
{
this->weight(itm.weight());
strcpy(m_name, itm.name());
}
return *this;
}
bool item::operator!=(const item& itm) const
{
return (strcmp(m_name, itm.name()) != 0);
}
編集2
名前 c-string を動的に割り当てようとするのをやめたので、重み関数でメモリ エラーが発生しています...
double item::weight(void) const {
return m_weight;
}
void item::weight(double wght)
{
m_weight = wght;
}