Назначение оператора только на одного из двух родителей - PullRequest
1 голос
/ 01 сентября 2011

У ребенка двое родителей: Фу и Бар.Foo не позволяет копировать.Бар делает.Как Child может использовать оператор присваивания Bar для копирования в подмножество Bar ребенка (при этом оставляя подмножество Foo нетронутым)?

Чтобы быть более конкретным: в коде ниже, как Child может ссылаться только на Bar внутри replace_bar ()?(Как бы вы изменили строку (X), чтобы код компилировался?)

class Foo
{
public:
    Foo () {}
private:
    Foo (const Foo & f) {} // forbid copy construction
    Foo & operator= (const Foo & foo) {} // forbid assignment
};

class Bar
{
public:
    Bar () {}
    Bar & operator= (const Bar & bar) {}
};

class Child : public Foo, public Bar
{
public:
    Child () {}
    void replace_bar (const Bar & bar2)
    {
        *this = bar2;           // line (X)
    }
};

int main ()
{
    Child child;
    Bar newbar;
    child.replace_bar (newbar);
}

1 Ответ

1 голос
/ 01 сентября 2011
void replace_bar(const Bar& bar2) {
     Bar::operator=(bar2);
}

В других новостях вы пропускаете return *this; в Bar::operator=, и если все, что вы хотите сделать, это предотвратить копирование Foo, вам не следует определять конструктор копирования и оператор присваивания, только объявлять их. Таким образом, даже если вы попытаетесь использовать их из класса, вы получите ошибку (хотя и ссылку, а не ошибку компиляции).

class Foo {
    Foo(const Foo&); // no body
    Foo& operator=(const Foo&); // ditto
public: 
    Foo() { }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...