0

所以我有一个基类有一个私有成员和一个派生类也有一些成员,基类定义了一个运算符=,这是我的问题:

这是正确的方法还是有更好的方法?我是否在此过程中进行任何切片?

class A
{
private:
int* Arr;
public:
A(){
    Arr=new int[10];
    for(int i=0;i<10;i++){
        Arr[i]=2*i;
    }
}
const A& operator=(const A& a){
    delete []Arr;
    Arr=new int[10];
    for(int i=0;i<10;i++){
        Arr[i]=a.Arr[i];
    }
    return *this;
}
};

class B: public A
{
private:
int * Arr2;
public:
B(){
    Arr2=new int[10];
    for(int i=0;i<10;i++){
        Arr2[i]=3*i;
    }
}
const B& operator=(const B& b){
    A::operator=(b);
    delete []Arr2;
    Arr2=new int[10];
    for(int i=0;i<10;i++){
        Arr2[i]=b.Arr2[i];
    }
    return *this;
}   
};

我知道这不是一个完美的代码,但我只是为这个问题写了一个简单的代码。

4

3 回答 3

1

经过大量研究,我得出了以下结论:

虽然基类赋值运算符的这种使用将正常工作

A::operator=(b)

正如评论中提到的那样,代码仍然需要提供适当的异常安全、自分配安全保证。

此外,由于我们需要实现一个赋值运算符,这也意味着根据三规则我们将需要实现一个复制构造函数,正如这里提到的,这将导致不必要的代码重复。

那么我们如何解决所有这些问题(可能还有更多..)?我发现最好的原因是使用Copy-and-Swap-Idiom。我相信除了该帖子中提供的内容之外,不需要进一步的解释。

于 2013-06-25T21:19:35.623 回答
0

你想要的不是类的层次结构。分配给基础对象以获取派生对象的属性是不可能的。基础对象将始终保持为基础对象。如果您希望具有多态行为但保持合理的值语义,请将多态性封装在非多态类中:

class A_impl;

class A {
public:
    //Public interface:
    //...

private:
    //Assuming `value_ptr` similar to
    //https://bitbucket.org/martinhofernandes/wheels/src/17aee21522ce8d07c7a74b138e528fadf04d62ed/include/wheels/smart_ptr/value_ptr.h%2B%2B?at=default
    value_ptr<A_impl> impl;
};


class A_impl {
public:
    //Implementation interface:
    //virtual ...
    //virtual ~A_impl() {}
};

class B : public A_impl {
public:
    //Implementation:
    //...
};
于 2013-06-25T13:43:33.903 回答
-1

您应该编写复制构造运算符。

于 2013-06-25T10:11:17.403 回答