嘿所以我对C ++很新,我不确定为什么这不起作用。我有两个类,让我们称他们为ned和myfile。我需要在每个ned对象中有两个文件对象。这是一个简化:
class myfile {
public:
int nData;
int nHeaderSize;
myfile() {
nData=0;
nHeaderSize=0;
}
};
class ned {
public:
myfile *pSrc,*pTgt;
ned() {
myfile* pSrc = new myfile();
myfile* pTgt = new myfile();
}
};
int main(int argc, char* argv[]) {
ned* nedObj = new ned();
nedObj->pSrc->nData=5; //Access violation error here
}
这显然是一个简化版本,但任何想法都值得赞赏。如果从这个小例子中问题不明显,我可以添加更多代码。
编辑:修正了在转换为较小的示例时输入错误的分号
答案 0 :(得分:4)
更改
ned() {
myfile* pSrc = new myfile();
myfile* pTgt = new myfile();
}
到
ned()
: pSrc(new myfile),
pTgt(new myfile) {
}
目前,您的代码未初始化nedObj
。相反,ned
的构造函数会创建两个名为pSrc
和pTgt
的局部变量。变量很快就会超出范围,泄漏资源。
答案 1 :(得分:3)
class ned {
public:
myfile *pSrc;*pTgt;
ned() {
myfile* pSrc = new myfile();
myfile* pTgt = new myfile();
}
};
应该是:
class ned {
public:
myfile *pSrc;*pTgt;
ned() {
this->pSrc = new myfile();
this->pTgt = new myfile();
}
};
答案 2 :(得分:0)
我继续为你修好
class myfile {
public:
int nData;
int nHeaderSize;
myfile() {
nData=0;
nHeaderSize=0;
}
}; **//missing semicolon here**
class ned {
public:
myfile *pSrc, *pTgt; **//was myfile *pSrc;*pTgt, needed a coma instead**
ned() {
myfile* pSrc = new myfile();
myfile* pTgt = new myfile();
}
}; //missing semicolon here
int main(int argc, char* argv[]) {
ned* nedObj = new ned();
nedObj->pSrc->nData=5; **//Access violation error here**
}
答案 3 :(得分:-1)
将构造函数更改为:
ned() {
pSrc = new myfile(); // pSrc is an already defined member.
pTgt = new myfile(); // Same for pTgt.
}
如果您使用myfile* pSrc
,则声明一个与pSrc
成员变量不同的新变量。
还记得释放记忆:
~ned()
{
delete pSrc;
delete pTgt;
}