Как определить / объявить intance класса в файле .hpp / .cpp? - PullRequest
0 голосов
/ 27 января 2010

Я почти уверен, что этот вопрос очень нуб, но я не привык к C ++.

У меня есть .hpp для определения класса и .cpp для реализации класса. У меня есть несколько частных экземпляров в классе, например:

class Test
{
    Test(void);

    private:
        SomeClass anInstance;
};

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

Test::Test(void)
{
    SomeClass anInstance(constructor parameters);
}

Заранее спасибо!

EDIT:

Мммм, извините, но я не понимаю, о чем вы, поэтому позвольте мне показать вам лучший пример:

class A
{
    public:
        A(int p1,int p2);
}

class B
{
    public:
        B(A *p1,int p2);
}

class C
{
    public:
        C(void);
    private:
        A instanceA;
        B instanceB;
}

Затем при реализации конструктора класса C я хочу создать instanceA и передать его конструктору instanceB. Надеюсь, что это проясняет вопрос.

Ответы [ 4 ]

4 голосов
/ 27 января 2010

Нет, вам нужен список инициализации:

Test::Test(void) : anInstance( parameters)
{
}

Это будет хорошо работать для фиксированных параметров, таких как "foobar" или 42, но если вам нужно передать переменные параметры, вам также нужно изменить определение конструктора Test (и объявление в заголовке). Например, если для инициализации экземпляра требуется int, вам необходимо:

Test::Test( int someval ) : anInstance( someval )
{
}

Редактировать: Чтобы сделать то, о чем вы просите в своем редактировании, вам может быть лучше создавать объекты динамически и с помощью указателей. Тем не менее, вы можете сделать это и со значениями (используя структуру, чтобы минимизировать мои усилия при наборе текста):

struct C {

    int a;
    int b;

    C() : a(1), b(a) {
    }
};

Если вы сделаете это, обратите внимание, что порядок инициализации - это порядок, в котором переменные-члены появляются в классе / структуре, а не порядок в списке инициализации.

2 голосов
/ 27 января 2010

Нет, члены класса будут инициализированы автоматически при создании Class. Будет запущен конструктор по умолчанию (с нулевым аргументом).

Если такого конструктора нет, вам нужно сделать явный вызов из списка инициализации вашего класса :

Class::Class()
: anInstance(4711, "w00t!")
{
}

Список инициализации - это код между двоеточием и открывающей скобкой; это где вы инициализируете членов экземпляра. Этот код выполняется перед кодом в фигурных скобках.

1 голос
/ 27 января 2010

Во-первых, вам не нужна пустота в объявлении конструктора Test.

Если у SomeClass есть некоторые параметры для передачи, вы можете передать их следующим образом:

Test::Test() : anInstance(params)
{

}
0 голосов
/ 27 января 2010

Если вы ничего не надеваете с объектом SomeClass, будет вызван конструктор по умолчанию SomeClass. Если вы хотите вызвать его с конкретными аргументами, вам нужно передать аргументы, подобные этому:

Test::Test(void) : anInstance(arg1, arg2, ..) {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...