2015-03-27 3 views
0

В C, мы на самом делеКак я могу инициализировать структуру на C++?

struct node *p = (node*)malloc(sizeof(node)); // casting is not necessary 
p->a = 0;  // first element 
p->b = NULL; // second element 

динамически выделять пробелы в памяти, но как я могу сделать это в C++ путь?

Является ли линия ниже правильной догадки?

node *p = new node {0, NULL}; 
+1

Это позволит получить много личного мнения. Я лично считаю, что C-путь лучше всего в коде на C++. –

+5

@EugeneK: Личное мнение на самом деле не приходит в это дело. Для подавляющего большинства типов C++ ваш «C-путь» - _wrong_. Я не просто имею в виду плохой совет, или плохой стиль. Я имею в виду _wrong_. Разбитый. –

+0

, если вы не используете некоторую библиотеку низкого уровня, никогда не вводите новый – sp2danny

ответ

6

Да, вы правы.

Предполагая, что node представляет собой агрегат, your C++ version is right (по модулю NULL, а не nullptr).

При этом, если эти начальные значения «по умолчанию», вы обычно написать конструктор по умолчанию для инициализации этих элементов для вас автоматически:

struct node 
{ 
    int a; 
    node* b; 

    node() : a(0), b(nullptr) {} 
}; 

Тогда вы бы просто написать:

node* p = new node; 

Или лучше:

auto p = std::make_unique<node>(); 

Или еще лучше:

node n; 

По умолчанию-строительство имеет некоторые последствия. Возможно, вам не нужны конструкторы.

1

В C++ вы бы избежать обнаженный новый и либо создать общий/уникальный указатель с std::make_shared/std::make_unique в C++ 11/14 или инкапсулировать распределение в руко-классе после RAII идиомы.

Чтобы дать пример того, как это будет работать:

class Foo { 
    const int i; 
    public: 
    int j; 
    Foo(int i) : i{i}, j{0} {}//constructor 
    void foo() {std::cout << i << "\n";} 
}; 

int main() { 
    unique_ptr<Foo> fp = make_unique<Foo>(5); 
    fp->foo(); 
    return 0; 
} 

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

Foo(ArgType1 arg1, ArgType2 arg2,...,ArgTypeN argN) : 
    member1(arg1), member2(arg2), ... , memberN(argN) {//empty body} 

Обязательно обратите внимание на rule of three/five, при написании конструкторов.

+0

«Новая» часть этого отдельного вопроса, я думаю.Для меня это похоже на вопрос о инициализации * данных структуры. – crashmstr

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