2013-02-25 2 views
0

Я пытаюсь создать класс, содержащий другой класс в качестве переменной-члена. И я сталкиваюсь с проблемой последующей:конструктор класса, содержащий другой класс в качестве переменных-членов

class SubClass{ 
    .... 
}; 

class MainClass{ 
    public: 
    MainClass(SubClass const & subClass_); 
    private: 
    SubClass subClass 
}; 

и в .cpp файлов для конструктора

MainClass::MainClass(SubClass const & subClass_){ 
    subClass = subClass_; 
} 

Это выдает ошибки компилятора. Но следующие работы:

MainClass::MainClass(SubClass const & subClass_): 
    subClass(subClass_) {} 

Может ли кто-нибудь сказать мне, в чем разница этих двух?

+1

Одно назначается после построения, другое - копирование. Объявление 'SubClass' является ключом к пониманию того, почему компилируется, а почему нет. – Johnsyweb

+1

Пожалуйста, заполните содержание '....' в декларации 'SubClass'. – dasblinkenlight

+2

[This one] (http://stackoverflow.com/questions/1711990/what-is-this-weird-colon-member-syntax-in-the-constructor), кто-нибудь? Есть большой заголовок под названием ** В чем разница между инициализацией и присваиванием внутри конструктора? **. – chris

ответ

0

Это, скорее всего, указывает, что SubClass не поддерживает оператор присваивания (который требуется в вашем прежнем коде). Последний код не ссылается на задании, а копия инициализирует элемент подкласса из subClass_

Больше можно сказать, как только вы положили в определении SubClass

+0

Это не единственная возможность.Он также не сможет скомпилировать, если нельзя вызвать конструктор по умолчанию SubClass. – Max

0

Вы не можете копировать объект, просто с помощью «=», если этот оператор не является «перегружен», чтобы каким-то образом клонировать объект. Однако здесь у subClass есть конструктор, который копирует входной объект в новый, поэтому вы можете использовать второй код.

0
  • в первом случае operator= используется, он применяется к уже созданного экземпляра класса (первый по умолчанию экземпляр класса создается, а затем оператор = вызывается)
  • в второй случай с использованием инициализации члена позволяет использовать конструктор copy для создания экземпляра класса, поэтому он сначала инициализирует его необходимым значением.

Разница:
2-й случай считается более эффективным, так как он занимает меньше операций для выполнения.
1-й случай - требует, чтобы класс имел конструктор по умолчанию. не

Вы проблема, скорее всего, результатом отсутствия реализации конструктора по умолчанию для MainClass, до тех пор, как вы реализовали вам собственную версию конструктора - компилятор больше не создает специальную функцию-член (конструктор по умолчанию)

Solution : реализовать конструктор по умолчанию/использовать синтаксис инициализации члена (вариант выбора в соответствии с логикой вашего приложения)

Смежные вопросы