c++ - 类中字符数组的正确数据成员
问题描述
我正在使用 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, anArray, DefaultSize);
};
在您的版本中,您theArray
在构造函数中声明了一个局部变量,该变量隐藏了在类中声明的变量,因此您的构造函数不会初始化类变量。
还有其他问题,strncpy
它本身就是一个有问题的函数,因为它不保证结果数组是空终止的。
;
在构造函数定义的末尾有一个额外的
new
如果抛出异常,您的代码将无法正常运行,因为您的析构函数将尝试删除未初始化的指针。这个更好
A::A(const char* anArray, size_t DefaultSize) : theArray(nullptr) {
theArray = new char[aDefaultSize];
strncpy(theArray, anArray, DefaultSize);
}
更好的是这个
A::A(const char* anArray, size_t DefaultSize) : theArray(new char[aDefaultSize]) {
strncpy(theArray, anArray, DefaultSize);
}
推荐阅读
- r - 如何将 FeatureCollection 中的 geojson 数据加载到 data.frame 中?
- java - Android Java - EditText,appendText 到 inputType Number
- java - Java 将输入追加到文件
- c# - c#文本到int64表示
- javascript - JavaScript 私有成员 - 没有第 3 阶段预设
- php - Access97 比较两个日期
- go - 如何在golang中打印变量,在外面,在外面?
- javascript - TypeError: $(...).valid 不是函数
- angular - Angular,如何在 FormArray 的特定 FormControl 中设置焦点
- typescript - 如何在渲染页面之前等待firebase加载数据