我正在为 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 字符串,因此我被混乱的细节所困扰。我对指针和类的理解是,当同时使用两者时,我们需要实现析构函数、复制构造函数和重载赋值运算符。我已经完成了以上所有。我在 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 字符串,我在权重函数上遇到内存错误......
double item::weight(void) const {
return m_weight;
}
void item::weight(double wght)
{
m_weight = wght;
}