Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Структура в структуре


Автор: leporel 2.5.2010, 20:56
Как к ней обратиться?

Допустим вот 
Код

struct notebook 
{
    char model[21];
    struct size{
        float x;
        float y; 
        float z;
    };
    float w;
    int price;
};

Автор: Abyx 2.5.2010, 20:58
leporel, к такой - никак. ты не объявил ее поле. надо

Код

struct notebook 
{
    char model[21];
    struct size{
        float x;
        float y; 
        float z;
    }
    foo;   // <------------
    float w;
    int price;
};

notebook n;
n.foo.x = 1;

Автор: ncr 10.5.2010, 20:11
Или сделать её неименованной:

Код

struct notebook 
{
    char model[21];
    struct         // <------------
    {
        float x;
        float y; 
        float z;
    }
    float w;
    int price;
};
notebook n;
n.x = 1;


Автор: KOHCEPBATOP 11.5.2010, 10:53
Цитата(ncr @  10.5.2010,  20:11 Найти цитируемый пост)
Или сделать её неименованной:

ИМХО, плохой стиль. Не стоит демонстрировать новичку возможности языка, которые не стоит использовать.

Автор: GoldFinch 11.5.2010, 12:03
KOHCEPBATOP, 
единственный минус - это не переносимо, т.к. нестандартное расширение языка, при максимальном уровне предупреждений будет соответствующее предупреждение. В остальном, неименованные структуры это удобно.

Автор: KOHCEPBATOP 11.5.2010, 12:37
GoldFinch, какую тогда смысловую нагрузку они несут? В чем их преимущество перед именованными?
Структуры без тега ("struct  {") очень хреново отлаживаются в Borland C++.

Автор: GoldFinch 11.5.2010, 13:18
KOHCEPBATOP, их преимущество в удобном синтаксисе доступа к полям
особенно это заметно когда есть вложенные union'ы и struct'ы

Код

struct Foo
{
....................
    union
    {
        struct
       {
            short w0, w1;
       } w;
       int dw;
    } u;
....................
}


А Borland C++ мало кто пользуется.

Автор: KOHCEPBATOP 11.5.2010, 13:41
GoldFinch, у тебя совсем другой пример. Посмотри пример ncr. У него описывается вложенная структура не только без тега, но и без идентификатора. 
Или ты хочешь сказать, что такой код:
Код

struct Foo
{
....................
    union
    {
        struct
       {
            short w0, w1;
       }; // <--------
       int dw;
    }; // <--------
....................
}

нормален?

Добавлено через 3 минуты и 26 секунд
Цитата(GoldFinch @  11.5.2010,  13:18 Найти цитируемый пост)
А Borland C++ мало кто пользуется. 

На самом деле "проблема" решается предельно просто - если в голову не приходит осмысленное название структуры, не стоит из-за этого терять время:
Код

struct Foo
{
....................
    union U
    {
        struct S
       {
            short w0, w1;
       } w;
       int dw;
    } u;
....................
}

Автор: GoldFinch 11.5.2010, 13:57
KOHCEPBATOP, действительно, идентификаторы я там зря написал =\

да, вполне нормальный код

Автор: JackYF 11.5.2010, 18:08
Цитата(KOHCEPBATOP @  11.5.2010,  09:53 Найти цитируемый пост)
которые не стоит использовать. 

Это кто так решил?

Цитата(GoldFinch @  11.5.2010,  11:03 Найти цитируемый пост)
это не переносимо, т.к. нестандартное расширение языка

Правда? А первая ссылка из гугла не согласна: http://www.cprogramming.com/reference/struct/declare.html. Впервые слышу, что неименованная структура не стандартна.

Цитата(KOHCEPBATOP @  11.5.2010,  11:37 Найти цитируемый пост)
Структуры без тега ("struct  {") очень хреново отлаживаются в Borland C++. 

Это личные проблемы этого компилятора.

Автор: SVN74 11.5.2010, 19:07
Цитата(leporel @  2.5.2010,  20:56 Найти цитируемый пост)
Как к ней обратиться?


Код

#include <iostream>
using namespace std;
struct notebook
{
    char model[21];
    struct {
        float x;
        float y;
        float z;
    } size; // перемещаем сверху в низ
    float w;
    int price;
};

int main(int argc, char* argv[])
{
    notebook NBK;

        strcpy(NBK.model, "Hi this is my example");

        NBK.size.x = 0.56;
        NBK.size.y = 672.78;
        NBK.size.z = 10.45;
        NBK.w = 12.7654;
        NBK.price = 45231;

    cout << "model = " << NBK.model <<endl
         << "size: " << "| x = " <<NBK.size.x
                     << "| y = " << NBK.size.y
                     << "| z = " << NBK.size.z <<endl
         << "w = " << NBK.w <<endl
         << "price = " << NBK.price ;


    return 0;
}

(Turbo C++)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)