我有以下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;
}
这两种情况是否正确。
答案 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