2013-02-17 4 views
5

В моем коде я делаю следующее, но я не уверен, что мне «разрешено», или если это хорошая техника проектирования. Мне нужно создать пустой конструктор, но мне также нужен конструктор, который инициализирует переменные, заданные параметрами. Поэтому я делаю следующее:Пустые конструкторы в C++:

Это файл C.h.

class C 
{ 
    private: 
    string A; 
    double B; 
    public: 
    //empty constructor 
    C(); 
    C(string, double); 
} 

И мой C.cpp файл:

//this is how I declare the empty constructor 
C::C() 
    { 

    } 


    C::C(string a, double b) 
    { 
     A = a; 
     B = b; 
    } 

ли способ я объявить пустой конструктор права или мне нужно установить = NULL и B = 0.0?

+1

Вы не пытались его скомпилировать? – Anil

+0

Он работает, компилируется и запускается, конечно, я просто спрашиваю, разрешено ли это «разрешено» или плохой метод проектирования. – FranXh

+0

Если он скомпилирован, тогда это разрешено. для этой простой программы вы не должны думать о аспектах дизайна. – Anil

ответ

9

Ваш пустой конструктор не делает то, что вы хотите. Элемент данных double не будет инициализирован нулем, если вы не сделаете это самостоятельно. std::string будет инициализирован пустой строкой.Таким образом, правильное выполнение конструктора по умолчанию будет просто

C::C() : B() {} // zero-initializes B 

Что касается другого конструктора, вы должны предпочитать список инициализации:

C::C(const string& a, double b) : A(a), B(b) {} 

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

1

Вы можете оставить это как есть. Вы можете сделать это, потому что как string, так и double могут быть построены по умолчанию. Это означает, что вы можете сказать string foo; и не получить никаких ошибок.

Contrast это с тем, что здесь происходит:

class Bar{ 
    private: 
     Bar(); //Explicitly private; 
}; 
Bar b; 

Здесь мы получаем ошибку о не конструктор Bar::Bar() быть найден.

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

+0

Но OP, вероятно, хочет, чтобы 'double' был инициализирован нулем, а это не с пустым конструктором. – juanchopanza

2

A std::string, вы не можете установить его в NULL, но можете установить пустую строку, а std::string имеет конструктор по умолчанию, который по умолчанию инициализирует его пустой строкой.

C::C() 
:B(0.0) 
{ 
} 

Возможно, вам нужен конструктор конструктора с параметром по умолчанию вместо двух кондукторов?

C(const string& a= "", double b= 0.0) 
: A(a), 
    B(b) 
{ 
} 
0

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

Вы можете улучшить свой код конструктора, написав его, как этот

C::C(string a, double b):A(a), b(b) 
{ 
} 
+0

Но «инициализация» двойника оставляет его с неопределенным значением, чего не хочет OP. – juanchopanza

3

Это прекрасно, чтобы сделать это и оставить конструктор пустым, но вы должны знать, что неинициализированные поля имеют неопределенные значения. string - это класс, и его конструктор по умолчанию заботится о его инициализации, но double здесь не инициализируется (в вашем конструкторе defualt), и его значение не определено (это может быть любое ранее существовавшее ранее значение в памяти).

2

Вы единственный человек, который может ответить на этот вопрос, потому что он полностью соответствует по вашим требованиям к объекту, построенному по умолчанию. Поскольку вы не указали, каковы ваши требования, невозможно дать окончательный ответ. Некоторые люди догадаются, что вы должны инициализировать B до 0, но это решение должно основываться на вашем дизайне, а не на разных понятиях «хорошей» практики программирования.

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