类中字符数组的正确数据成员

问题描述

我正在使用 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);
}