赋值包括指针的结构体



考虑下面的简单程序。它只是从MyStruct中定义了两个变量AB,然后初始化A

如何用B的新指针复制AB ?

如果我使用赋值运算符,BfirstMember将被AfirstMember赋值,每当我改变B.firstMember[i]的值时,A.firstMember[i]的值也会改变。我已经知道它可以用一个函数来完成,但是有没有更简单的方法?假设MyStruct可以有很多指针,写一个函数似乎不太好。

typedef struct MyStruct
{
    int * firstMember;
    int secondMember;
} MyStruct;
int main()
{
    MyStruct A;
    MyStruct B;
    Initialize(A);            // initializes A such that A.firstMember[0] != 5
    B = A;
    B.firstMember[0] = 5;
    cout<<A.firstMember[0];   // prints 5
    return 0;
}

这符合" 3原则"。一旦开始管理类中的原始指针,出于这个原因,您可能希望定义自定义构造函数、析构函数和赋值操作符。

首先,我不明白为什么两个成员中,一个是指针,而另一个不是。我假设第一个成员是一个指针,指向一个整数。下面是该结构的改进代码片段:

struct MyStruct
{
    int * firstMember;
    int secondMember;
    MyStruct& operator = (const MyStruct& src) {
      *firstMember = *src.firstMember;
      return *this;
    }
    MyStruct(int a = 0) {
      firstMember = new int(a);
      secondMember = a;
    }
    MyStruct(const MyStruct& src) {
        // deep copy
        firstMember = new int(*src.firstMember);
        secondMember = src.secondMember;
    }
    ~MyStruct() {
        if (firstMember)
          delete firstMember;
    }
};

注意,struct是一个所有成员默认声明为public的类。与其用C方式初始化,不如使用c++的构造函数,你还需要复制构造函数和赋值操作符。

最新更新