Наличие подкласса принимает ссылку на родителя в конструкторе - PullRequest
1 голос
/ 16 марта 2012

У меня есть иерархия классов, которую можно просто выразить так:

struct Parent {
    Parent() { }
    Parent(Parent& p, std::string s) { }

private:
    // I want this class to be non-copyable
    Parent(const Parent&);
};

struct Child : public Parent {
    Child() { }
    Child(Parent& p) : Parent(p, "hi") { }
};

Когда я пытаюсь создать два экземпляра, подобные этому:

Child c1;
Child c2(c1);

Я получаю следующую ошибку от Clang:

test.cpp:37:8: error: call to deleted constructor of 'Child'
        Child c2(c1);
              ^  ~~
test.cpp:30:8: note: function has been explicitly marked deleted here
struct Child : public Parent {
       ^
1 error generated.

Я хочу, чтобы этот класс не был копируемым, поэтому есть ли способ вызвать перегрузку Parent& вместо конструктора копирования? Я знаю, почему он так себя ведет, но я ищу обходной путь. Я хотел бы, чтобы Child(Parent& p) был вызван без необходимости разыгрывать его.

Я получаю эту ошибку в GCC и Visual Studio. Я не понимаю, что такое с компилятором Intel, но непротиворечивое поведение остальных трех, похоже, указывает на то, что это неправильно, а остальные - правильно.

Ответы [ 2 ]

3 голосов
/ 16 марта 2012

Вы говорите, что не хотите, чтобы ваш класс копировался.

Вы также говорите в своем вопросе, что хотите, чтобы следующий фрагмент работал:

Child c1;
Child c2(c1);

Эти требованияпротиворечат друг другу.

0 голосов
/ 16 марта 2012

Вы полагаетесь на автоматически сгенерированный конструктор копирования Child, делая конструктор копирования родительского объекта недоступным. Кажется, что происходит, что автоматически сгенерированный конструктор копирования для Child пытается вызвать конструктор копирования для родителя, но не может, потому что это личное.

Если вы не хотите добавлять конструктор копирования, похоже, вам нужно либо явно привести c1 к родительской ссылке:

Child c2(static_cast<Parent&>(c1));

или объявите конструктор копирования для Child.

Кроме того, я не верю, что есть обходной путь.

...