2016-11-03 5 views
1

Пусть говорят, что я имею этот класс:Как пример Класс из заголовка, который выбирает правильный CTOR?

class MyClass 
{ 
private: 
    bool mIsMeter = false; 

public: 
    MyClass(bool isMeter = false) { 
     mIsMeter = isMeter; 
    } 
    ~MyClass() { 

    } 
}; 

Теперь в myClasses.h, я пишу:

MyClass mMyClass; 

это экземпляр класса с использованием CTOR по умолчанию в стеке (в моем примере, используя isMeter = false). Что делать, если я хочу (оттуда) инициализировать класс, проходящий true в качестве параметра?

я мог бы сделать это в myClasses.cpp, но чем она будет создавать первый стек oversion из mMyClass с false, а затем повторно выделить его с помощью mMyClass = MyClass(true).

Не пустая трата ресурса? Не можете просто запустить его из заголовка?

ответ

2

Каждое определение переменной может включать инициализатор. В вашем случае, вы могли бы сделать это следующим образом:

MyClass mMyClass(true); 

Обратите внимание, что это предполагает, что mMyClass является глобальной (или пространства имен сфера) переменной. Если это так, просто имейте в виду, что он будет определен в каждый файл, который включает заголовок. Поэтому, если вы включите его в несколько файлов, вы получите ошибки компоновщика (множественное определение).

Если mMyClass фактически является членом, объявленным в рамках определения другого класса (как представляется, указывается имя, начинающееся с m), комментарий с множественным определением, конечно, не применяется. Это еще можно инициализировать mMyClass при объявлении, но вам придется использовать либо копировать инициализацию или список инициализацию:

// either 
MyClass mMyClass = true; // this one might call copy ctor 
// or 
MyClass mMyClass{true}; // this one guarantees one ctor call only 

Однако, вы можете также инициализировать его как часть MEM-инициализатора-лист из конструктор содержащего класса. Это было бы примерно так:

class OtherClass 
{ 
    MyClass mMyClass; 

public: 
    OtherClass(int i) : mMyClass(i > 42) {} 
}; 
+0

Я не могу написать MyClass mMyClass (true); в файле заголовка. Он говорит «Ошибка, ожидаемый идентификатор типа» – markzzz

+0

@paizza. Затем вы помещаете его в неправильное место. Поскольку вы не указали [mcve] в своем вопросе, мне трудно сказать больше. – Angew

+0

Вот вы: http://coliru.stacked-crooked.com/a/e31a2ef96ae46430 Я не могу делать 'MyClass mMyClass (true);', только 'MyClass mMyClass;' – markzzz

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

  • Нет связанных вопросов^_^