2016-07-17 5 views
-2

Это может быть очень простой вопрос. Как я могу вызвать конструктор после объявления переменной? Например, это рабочий код:Конструктор вызовов после объявления

// in header 
class Bar 
{ 
    SomeClass *foo; 
public: 
    Bar(); 
} 

// in .cpp 
Bar::Bar() 
{ 
    foo = new SomeClass(1, 2, 3); 
} 

Но как я могу изменить это так foo не указатель?

Спасибо!

+1

Что означает комментарий в классе? Добавьте конкретный пример своей проблемы. На данный момент я проголосовал за то, чтобы закрыть как ** отсутствующий пример **. –

+0

@ Cheersandhth.-Alf Я редактировал вопрос. –

+0

ОК, я отозвал закрытый голос. –

ответ

1

Если foo определяются внутри класса, то используйте список инициализации конструктора следующим образом:

class X { 
    X() : foo(1,2,3) {} 
    SomeClass foo; 
}; 

Если вам нужно вычисленные аргументы foo -s конструктор, то она становится все более трудной. Вы можете добавить функции, которые вычисляют бы ваши ценности, т.е. .:

class X { 
    X() : foo(initX(),initY(),initZ()) {} 
    SomeClass foo; 

    static int initX() { return 1;} 
    static int initY() { return 2;} 
    static int initZ() { return 3;} 
}; 

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

Вы также можете передать эти значения в качестве параметров конструктора.

+0

Действительно? Я имею в виду, что это должна быть общая проблема - у вас есть класс с некоторой переменной (классом), и вы хотите вызвать его конструктор с некоторыми аргументами (а не по умолчанию ctor). Итак, единственное решение - использовать указатель? –

+1

@ MartinHeralecký см. Мое edit2, я думаю, что это должно быть решение – marcinj

+0

Re: Ваше первое редактирование, я удалил этот комментарий изначально, но потом понял, что действительно будет разрешено, однако 'foo' будет построено дважды, как вы говорите. – ArchbishopOfBanterbury

1

Заменить

class Bar 
{ 
    SomeClass *foo; 
public: 
    Bar(); 
}; 

Bar::Bar() 
{ 
    foo = new SomeClass(1, 2, 3); 
} 

& hellip; с

class Bar 
{ 
private: 
    SomeClass foo; 

public: 
    Bar(); 
}; 

Bar::Bar() 
    : foo{ 1, 2, 3 } 
{} 
+0

Это не решает проблему с вычисленными аргументами. –

+0

@ MartinHeralecký: Это не решает проблему плохих звуков из микроволновой печи, это правда. Но эта проблема нигде не упоминается. Какова «проблема с вычисленными аргументами»? Если он окажется нетривиальным, напишите новый вопрос. Не меняйте существующий вопрос по существу, потому что это приведет к аннулированию существующих ответов. –

+0

Downvoter, пожалуйста, объясните ваш downvote. –

1

Если вы объявляете это вне класса, это будет глобальная переменная. Для того, чтобы иметь его построили в файле .cpp вы должны, вероятно, объявить его ехЬегп в заголовке, а затем использовать конструктор вы хотите, когда вы объявляете его в CPP

SomeModule.h:

extern SomeClass foo; 

SomeModule.cpp :

SomeClass foo(1, 2, 3); 

Если это переменный-член класса, то вы можете использовать конструктор вы хотите явным образом инициализации переменного в списке элемента инициализации конструктора

OtherClass.h:

class OtherClass 
{ 
    SomeClass foo; 
    public: 
     OtherClass(); 
} 

OtherClass.cpp:

OtherClass::OtherClass() : foo(1, 2, 3) {}; 

При желании инициализировать в середине кода, как и в случае указатель, то вы можете просто позволить ей инициализировать с помощью конструктора по умолчанию и скопируйте значение, которое вы хотите, в том же месте, что и указатель

foo = SomeClass(1, 2, 3); 
Смежные вопросы