当类包含指向另一个对象的指针时重载赋值运算符

时间:2016-11-11 10:02:12

标签: c++

我有以下A类的代码

class A
{

int *ptr;

    public:
       A();
       A(const A &);
       ~A();
       A&  operator = (const A &);
       void display();
};

void A::display()
{

cout<<" ptr ="<<*ptr<<endl;
}

A::A()
{
    cout<<"A's constructor called"<<endl;
    ptr = new int;
    *ptr = 100;
}

A::A(const A &src)
{
    cout<<"copy constructor called"<<endl;
    ptr = new int;
    *ptr = *src.ptr;
}

A::~A()
{
    delete ptr;
    cout<<" destructor called"<<endl;
}

A&  A::operator = (const A &src)
{
    cout<<"A::assignmnet operator called"<<endl;
  if(&src != this)
  {

   delete ptr ;
   ptr = new int;
   *ptr = *src.ptr;

  }

    return *this;

}  

现在还有另一个B类,它包含一个指向A类的指针作为成员变量

class B
{
    A *a;
    public:
       B()
       {
           cout<<" B's constructor called"<<endl;
           a = new A();
       }

    B& operator = (const B &);
    ~B()
    {
        cout<<"B:destructor called"<<endl;
        delete a;
    }

    void display()
    {
     cout<<"inside B's display"<<endl;
     a->display();   
    }

};

现在B类的赋值运算符可以写成 1。

B& B::operator=( const B & src)
{

 cout<<"B's assignment operator called"<<endl;
    if(this != &src)
    {
         *a = *src.a;
    }

    return *this;

 }

或者作为 2。

 B& B::operator=( const B & src)
{

 cout<<"B's assignment operator called"<<endl;
    if(this != &src)
    {

        delete a;
        a = new A();
        *a = *src.a;
    }

    return *this;

 } 

这两种情况是否正确。

1 个答案:

答案 0 :(得分:2)

在您显示的代码中,WITH A AS ( SELECT DISTINCT columnA1 FROM Table1 UNION SELECT DISTINCT columnA2 FROM Table1 UNION SELECT DISTINCT columnA3 FROM Table1) WITH B AS (SELECT DISTINCT columnB1 FROM Table1 UNION SELECT DISTINCT columnB2 FROM Table1 UNION SELECT DISTINCT columnB3 FROM Table1) Select * from CASE WHEN (:PM_Parameter1 = 'A') THEN A ELSE B END; 不应该是指针,而只是声明为a

您的代码A a;拥有B的所有权。原因是双重的:

  • 您在A中明确创建A个对象,而不是B的派生类型

  • A拥有B的所有权:构造函数,析构函数和赋值。

如果您需要a上的某种多态性(使用A的派生类型),您可以使用A的智能指针。

您的第一个方案原因就像课程std::unique_ptr包含B一样。 第二种情况会导致课程A a包含B。两种情况都是正确的。但我认为第一个更符合(也更有效)w.r.t.当前的整个代码。

如果您需要多态性,则应使用std::unique_ptr的第二个。 请注意,在第二种情况下,您可以替换

std::unique_ptr<A> a

通过

a = new A();
*a = *src.a;

如果复制构造函数与w.r.t一致。赋值运算符。

使用a = new A(*src.a); 代码

A a

使用class B { A a; public: B() {} // calls A() B& operator = (const B & src) // or = default; { a = src.a; // this != &src is managed inside a return *this; } ~B() {} // no more usefull void display() { cout<<"inside B's display"<<endl; a.display(); } }; 代码

unique_ptr