问题描述
我正在使用 OCF(正统规范形式)方法在我的 .hpp 文件中实现以下类:
class A {
public:
A(const char* theArray,size_t DefualtSize=0);
~A();
A& operator=(const char* anArray);
protected:
char *theArray;
};
该类将获取一个字符串并将其存储在堆上的“A”对象中。我的 .cpp 文件中的实现如下:
A::A(const char* anArray,size_t DefaultSize) {
char *theArray = new char[aDefaultSize];
strncpy(theArray,anArray,DefaultSize);
};
A::~A() {
delete[] theArray;
};
当我写“protected: char *theArray;”时,我想知道我是否正确地将数据成员添加到类中?我是否应该将 theArray 数据成员声明为其他内容/初始化它。非常感谢!
解决方法
您的代码不正确,因为您重新声明了 theArray
A::A(const char* anArray,size_t DefaultSize) {
char *theArray = new char[aDefaultSize]; // redeclaration here
strncpy(theArray,anArray,DefaultSize);
};
这个更好
A::A(const char* anArray,size_t DefaultSize) {
theArray = new char[aDefaultSize]; // no redeclaration
strncpy(theArray,DefaultSize);
};
在您的版本中,您在构造函数中声明了一个局部变量 theArray
,该变量隐藏在类中声明的变量,因此您的构造函数不会初始化类变量。 >
还有其他问题,strncpy
本身就是一个有问题的函数,因为它不能保证结果数组是空终止的。
在构造函数定义的末尾有一个额外的 ;
如果 new
抛出异常,您的代码将无法正常运行,因为您的析构函数随后将尝试删除未初始化的指针。这样更好
A::A(const char* anArray,size_t DefaultSize) : theArray(nullptr) {
theArray = new char[aDefaultSize];
strncpy(theArray,DefaultSize);
}
更好的是这个
A::A(const char* anArray,size_t DefaultSize) : theArray(new char[aDefaultSize]) {
strncpy(theArray,DefaultSize);
}