Должен ли я создать временный объект для создания экземпляра переменной-члена в C ++?

0

У меня есть несколько классов:

class A():{
    public:
        A(T t);
};

class B(): {
    public:
        B(T t);
    private:
        A* _a;
};

Каков правильный способ создания B когда у меня есть только t? Должен ли я создать временную переменную типа A например:

B::B(T t):
    _a( &(A(t)) )
{ ... }

Мне кажется, что это не такая замечательная идея, хотя я не могу точно сказать, почему. Другой вариант (но не намного лучше):

B::B(T t):
    _a( 0 )
{
    _a = &(A(t)); 
}
  • 0
    Если вам нужен A, ваш конструктор действительно должен взять A.
  • 0
    Должно ли &(A,t) означать &(A(t)) ?
Показать ещё 3 комментария
Теги:
class

2 ответа

1
Лучший ответ

Никогда не делайте этого:

&(anything which lives temporarily)

так как это даст вам свисающий указатель. Зачем? Потому что вы сразу же отправляете адрес того, что нужно удалить.

При выполнении следующих действий:

_a(new A(t))

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

Пример с std::unique_ptr:

class B(): {
    public:
        B(T t) :
           _a(new A(t))
        { ... }

    private:
        std::unique_ptr<A> _a;
};
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню