Когда C ++ вызовет конструктор для объекта, который является членом класса? - PullRequest
4 голосов
/ 12 июля 2011

скажем, у меня есть класс

class MyClass {
    public:
        AnotherClass myObject;
};

Моя проблема в том, что я хочу инициализировать myObject с аргументами для его конструктора, в точности, если бы я объявлял его в стеке во время функции

AnotherClass myObject(1, 2, 3);

но я хочу сделать это для члена класса в конструкторе:

MyClass::MyClass() {
    myObject = ...?
    ...
}

Проблема именно в этом. Если я объявлю член класса, имеющий конструктор, вызовет ли C ++ конструктор по умолчанию? Как я все еще могу объявить переменную в определении класса, но инициализировать ее в конструкторе?

Спасибо за любые ответы!

Ответы [ 7 ]

8 голосов
/ 12 июля 2011

Используйте ctor-initializer . Члены инициализируются после базовых классов и до запуска тела конструктора.

MyClass::MyClass() : myObject(1,2,3) {
    ...
}
8 голосов
/ 12 июля 2011

Вы можете использовать список инициализаторов.

class MyClass {
    public:
        MyClass() : myObject(1,2,3){ }
        AnotherClass myObject;
};
4 голосов
/ 12 июля 2011

Google для Списки инициализации конструктора

http://www.learncpp.com/cpp-tutorial/101-constructor-initialization-lists/

3 голосов
/ 12 июля 2011

всегда используйте список инициализатора:

MyClass::MyClass() :
  myObject( 1, 2, 3 )
{
  //myObject = don't do this, bad practice!
}

см. http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6

3 голосов
/ 12 июля 2011
class A
{
public:
   A(int);
};

class B
{
public:
   B();

private:
   A my_a_;
};

// initialize my_a by passing zero to its constructor
B::B() : my_a_(0)
{
}
1 голос
/ 12 июля 2011

Лучший способ, который я могу придумать, - это инициализировать член в классе ctor, например, так:

class MyClass
{
public:
    MyClass(int param)
        : m_Object(param)
    { };

private:
    OtherClass m_Object;
};

Затем можно явно инициализировать элемент с любым желаемым ctor (а также предоставить несколько ctors с разными параметрами для обоих классов).

0 голосов
/ 12 июля 2011

Или предоставьте правильные конструкторы:

struct Foo{
  Foo(const Bar& b): myBar(b){}
  Bar myBar;  
}
//...
Foo myFoo1( Bar(1,2,3) );
Foo myFoo2( Bar(3,2,1) );

Или, если вы не хотите открывать панель, вы можете установить параметры, например

struct Square{
  Square(const int height, const int width): myDimension(width,height){}
  Dimension myDimension;
}
//...
Square sq(1,2);
Square sq(4,3);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...