我有以下课程(我已经修剪了不相关的东西):
class Example
{
private:
char* name;
int value[4];
int numVals;
public:
Example();
Example(char name[], int numVals, int, int, int, int);
~Example();
};
这是初始化构造函数:
Example::Example(char na[], int vals, int v1, int v2, int v3, int v4)
{
name = new char[strlen(na)+1];
strcpy(name, na);
numVals = vals;
value[0] = v1;
value[1] = v2;
value[2] = v3;
value[3] = v4;
// cout << name; // this DOES print out the correct text
}
在我的main()中,我有一个Example类数组Example myArray[numRecs]
。然后我有一个循环使用初始化构造函数来填充数组:
myArray[i] = Example(name, numVals, v[0], v[1], v[2], v[3]);
一切都按预期工作,但name
不会保留我放入其中的字符。我使用cout检查了传递给构造函数时的值是什么,这是正确的!但是,当我使用我的Example :: Print()时,它会吐出一个随机字符(示例的每个实例都有相同的字符)。
这是Example :: Print()
void Example::Print()
{
int total, avg;
total = avg = 0;
cout << left << setw(20) << name << '\t';
for(int i=0; i<4; i++){
if(i<numVals){
cout << left << setw(8) << value[i];
total += value[i];
} else
cout << left << setw(8) << " ";
}
avg = total/numVals;
cout << left << setw(8) << total <<
left << setw(8) << avg << endl;
}
有什么想法吗?谢谢!
哦,而且,这是一项任务。我们被告知要将name字段保留为char指针,而不是字符串。我很困惑我应该为init构造函数使用什么(char * name或char name []或..有区别吗?)
编辑:这是析构函数和默认构造函数。我还没有复制构造函数,因为赋值不会调用它并且它没有被使用。无论如何,我会继续做一个完整性。
Example::~Example()
{
delete [] name;
}
Example::Example()
{
numVals = 0;
for(int i=0; i<4; i++)
value[i] = -1;
}
答案 0 :(得分:2)
您应该通过内存调试器运行程序,以见证您创建的噩梦!
您在班级中使用手动内存管理,但是您忘记遵守规则三:您没有实现复制构造函数,赋值运算符和析构函数!因此临时确实分配内存,复制指针(浅),然后当内存超出范围时可能使内存无效。
立即“修复我的代码”的答案是你必须实现一个正确的赋值运算符和复制构造函数来制作一个char数组的深层副本。
“这是C ++”的答案不是使用指针,new
和数组,而是使用std::string
。
答案 1 :(得分:0)
一个简单的解决方法是存储指向数组中的Examples而不是实际对象的指针。这样,您就不必处理复制(您尚未实现)。