2016-10-15 2 views
2

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

Вот типичный способ написать такую-структуру:

struct Struct { 
    A a; 
    B b; 
    C c; 
    Struct(A a, B b, C c) : a(a) , b(b), c(c) {} 
}; 

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

+0

C++ довольно многословный, и я думаю, что нет. Одно предостережение: вы должны использовать (например) 'a {a}, b {b}, c {c}', поскольку равномерная инициализация предпочтительна для более старой инициализации '()' (см. [Этот вопрос] (https: // programers.stackexchange.com/questions/133688/is-c11-uniform-initialization-a-replacement-for-the-old-style-syntax)) – Majora320

+0

Этот класс не является обычным классом старых данных, потому что он не имеет конструктор по умолчанию. Вам нужно добавить 'Struct() = default;' –

ответ

0

Интересный вопрос. Я не думаю, что есть более короткий способ написать его, особенно здесь, где большинство имен - одна буква;)

В общем, определения типа C++ имеют тенденцию быть очень повторяющимися. Вы должны, например, повторить имя типа для всех конструкторов и деструктора. К сожалению, я думаю, что единственным решением является создание инструментов для создания кода для вас.

2

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

#include <iostream> 
using namespace std; 

struct xxx { 
    int a, b, c; 
}; 

int main() { 
    // your code goes here 
    xxx x{1,2,3}; 
    cout << x.a << x.b << x.c; 
    return 0; 
} 
+0

Спасибо! Ред. –

+1

@ M.M мой способ реализации - это только C++ 11. Я не использую '=' при построении объекта x. http://en.cppreference.com/w/cpp/language/aggregate_initialization –

0

В некоторых случаях может оказаться полезным использовать std::par<A, B> или std::tuple<A, B, C>.

Например:

std::tuple<A, B, C> t = std::make_tuple(a, b, c); 

Может быть, это будет работать для вас лучше в некоторых случаях.

+0

'std :: pair '? –

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