С++ инициализирует анонимную структуру

Я все еще зарабатываю свои крылья C++; Мой вопрос в том, есть ли у меня такая структура:

struct Height
{
    int feet;
    int inches;
};

И тогда у меня есть такие строки:

Height h = {5, 7};
Person p("John Doe", 42, "Blonde", "Blue", h);

Мне нравится инициализация структур с помощью фигурных скобок, но я бы предпочел, чтобы приведенное выше было в одной строке в анонимной структуре Height. Как мне это сделать? Мой первоначальный наивный подход был:

Person p("John Doe", 42, "Blonde", "Blue", Height{5,7});

Однако это не сработало. Я очень далек от цели?


person dreadwail    schedule 26.10.2010    source источник
comment
Это может быть просто пример, но, вероятно, лучше хранить Height как одно поле inches. Когда вам нужны футы, вы можете преобразовать их в футы; просто гораздо проще иметь дело с одной единицей, чем жонглировать несколькими единицами, тем более что сейчас вы можете иметь несколько значений, которые равны, но не имеют одинакового представления (например, {2, 3} и {1, 15}).   -  person James McNellis    schedule 26.10.2010
comment
C++1x поставляется с унифицированным синтаксисом инициализации, который поддерживает что-то вроде это. Вполне вероятно, что ваш компилятор уже поддерживает его.   -  person sbi    schedule 26.10.2010
comment
Вместо Height{5,7} в конструкторе Person укажите (struct Height){5,7} (если вы передаете по ссылке) (или &(struct Height){5,7}, если вы передаете указатель). Вы в основном приводите список инициализаторов к желаемому типу. Это функция C99+, но ее можно использовать и с C++.   -  person Erhhung    schedule 31.01.2014


Ответы (2)


Вы не можете, по крайней мере, не в современном C++; инициализация фигурной скобки является частью синтаксиса инициализатора и не может использоваться где-либо еще.

Вы можете добавить конструктор в Height:

struct Height
{
    Height(int f, int i) : feet(f), inches(i) { }
    int feet, inches;
};

Это позволяет использовать:

Person p("John Doe", 42, "Blonde", "Blue", Height(5, 7));

К сожалению, поскольку Height больше не является агрегатом, вы больше не можете использовать инициализацию фигурной скобки. Однако инициализация вызова конструктора так же проста:

Height h(5, 7);
person James McNellis    schedule 26.10.2010
comment
Аккуратный. Я не знал, что структуры могут иметь конструкторы/списки инициализаторов. - person dreadwail; 26.10.2010
comment
@byte: struct — это то же самое, что и class. Единственное отличие состоит в том, что базовые классы и члены по умолчанию являются общедоступными для struct и закрытыми для class. - person James McNellis; 26.10.2010

Стандартный C++ (C++98, C++03) не поддерживает это.

Поддержка g++ - это расширение языка, и я, кажется, припоминаю, что C++0x будет его поддерживать. Вам нужно будет проверить синтаксис расширения языка g++ и/или, возможно, C++0x.

Для текущего стандарта C++ просто назовите экземпляр Height, как вы уже сделали, а затем используйте это имя.

Ура и чт.,

person Cheers and hth. - Alf    schedule 26.10.2010
comment
Предоставляется ли он автоматически, или вам нужно определить конструктор, который принимает аргумент initializer_list? - person Ben Voigt; 26.10.2010
comment
@Ben: нет, вам не нужно определять конструктор, чтобы получить синтаксис C++0x. большая часть пункта/цели состоит в том, чтобы иметь унифицированный синтаксис, который работает одинаково в большинстве ситуаций. проверьте ссылку на Википедию, предоставленную @sbi ранее. Или, если вам нужны подробности, последний черновик доступен на страницах коммитов C++ в формате PDF. - person Cheers and hth. - Alf; 26.10.2010