c ++ Лучший способ назначить производный класс базовому классу - PullRequest
5 голосов
/ 20 октября 2011

Это кажется глупым вопросом, но я хочу иметь возможность создать экземпляр производного класса и назначить его базовому классу в одну строку:

class A { };
class B : public A { };

// i can do this
A *base;
B derived;
base = &derived;

// i'd like to do something like this
A *base;
base = &B(); // produces a warning: taking address of temporary

Я пытаюсь получить полиморфное поведение без использования оператора new. Я думаю, что компилятор вставляет временную ссылку на возвращаемое значение конструктора. Можно ли указать компилятору, что я действительно хочу использовать этот адрес для назначения?

* РЕДАКТИРОВАТЬ

Вот небольшой контекст. У меня что-то вроде этого при разборе XML-файла:

class element { virtual void load_xml(...); };
class city : public element { ... };
class state : public element { ... };

element *base;
// read some xml

if (xml_node == "city") {
  base = &city(); 
} else if (xml_node == "state") {
  base = &state();
} 

base.load_xml(...);

Идея состоит в том, что каждый производный узел знает, как себя увлажнить, и для этого переопределит функцию load_xml (). Я предполагаю, что мне действительно следует вызывать load_xml в каждом блоке if, а не пытаться присвоить каждому производному классу базу, а затем вызвать load_xml из базы в конце.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 20 октября 2011

Я хочу иметь возможность создавать производный класс и назначать его базовому классу в одну строку

Объект, созданный в одной строке (без использования оператора new), будет действовать только до конца выражения, которое его оценивает. Таким образом, к моменту, когда у вас есть адрес, временный адрес больше не существует.

Я пытаюсь получить полиморфное поведение без использования оператора new.

Чтобы сделать это, вам нужна именованная переменная, чтобы иметь допустимое время жизни для вашего объекта.

3 голосов
/ 20 октября 2011

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

Стек:

B derived; // this works as an A any place you need it to

Куча:

A* derived = new B();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...