я могу получить доступ к структуре внутри структуры без использования оператора точки? - PullRequest
3 голосов
/ 11 мая 2010

У меня есть 2 структуры, у которых 90% полей одинаковы. Я хочу сгруппировать эти поля в структуре, но я не хочу использовать оператор точки для доступа к ним. Причина в том, что я уже написал первую структуру и только что создал вторую.

до:

typedef struct{
  int a;
  int b;
  int c;
  object1 name;
} str1;  

typedef struct{
  int a;
  int b;
  int c;
  object2 name;
} str2;

Теперь я бы создал третью структуру:

typedef struct{
  int a;
  int b;
  int c;
} str3;

и изменит str1 и atr2 на это:

typedef struct{
  str3 str;
  object1 name;
} str1;

typedef struct {
  str3 str;
  object2 name;
} str2;

Наконец, я хотел бы получить доступ к a, b и c, выполнив:

str1 myStruct;
myStruct.a;
myStruct.b;
myStruct.c;

а не:

myStruct.str.a;
myStruct.str.b;
myStruct.str.c;

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

РАЗРЕШЕНО: спасибо за все ваши ответы. Последний способ сделать так, чтобы я мог использовать автозаполнение, был следующий:

struct str11<br> {<br> int a;<br> int b;<br> int c;<br> };<br> typedef struct str22 : public str11<br> {<br> QString name;<br> }hi;<br>

Ответы [ 6 ]

10 голосов
/ 11 мая 2010

Да. Скорее, используя C-стиль наследования, используя C ++ style:

struct str3{
  int a;
  int b;
  int c;
};

struct str2 : public str3{
  object2 name;
};
3 голосов
/ 11 мая 2010

Первое замечание. Это

struct
{
  int a;
  int b;
  int c;
} str3;

определяет объект str3, а не тип str3.

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

struct str1
{
  int a;
  int b;
  int c;
};


struct str2 : public str1
{
  object1 name;
};  
2 голосов
/ 11 мая 2010

Причина для этого заключается в том, что я хочу сохранить целостность данных, если произойдет изменение структуры *

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

class DataHolder {
    int a_, b_, c_;
public:
    int a() const { return a_; }
    int b() const { return b_; }
    int c() const { return c_; }
};

class User : public DataHolder {
    object o_;
public:
    object& getObject() { return o_; }
};
1 голос
/ 11 мая 2010

Я не уверен насчет C ++ (я все еще изучаю C ++), но в C некоторые компиляторы допускают анонимные структуры. В GCC 4.3 следующие компиляции без ошибок, если не указаны флаги, но не компилируются с -ansi или -std=c99. Он успешно компилируется с -std=c++98 однако:


int main (int argc, char *argv[])
{
    struct
    {
        struct
        {
            int a;
            int b;
            int c;
        };
        int test;
    } global;

    global.a = 1;
    global.b = 2;
    global.c = 3;
    global.test = 4;

    return global.b;
}
0 голосов
/ 11 мая 2010

Вы можете сделать это с GCC, как упоминалось в других плакатах , но в дополнение к этому вы можете использовать флаг -fms-extensions, который позволяет использовать ранее определенное struct в качестве неназванного поля.

Подробнее здесь .

0 голосов
/ 11 мая 2010

Не используйте глупые уловки, чтобы избежать правильного рефакторинга.Это сэкономит вам немного времени при наборе текста, но укусит вас позже.Если редактировать сложно, значит, вы используете не те инструменты и / или у вас плохая схема именования (трудно найти / заменить 1-буквенные имена).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...