簡體   English   中英

我可以在不使用點運算符的情況下訪問結構內部的結構嗎?

[英]can I access a struct inside of a struct without using the dot operator?

我有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;

有沒有辦法做這樣的事情。 這樣做的原因是我希望保持數據的完整性,如果發生結構的chnges並且不重復自己而不必更改我現有的代碼並且沒有嵌套太深的字段。

決議:thx為您的所有答案。 這樣做的最后一種方式,我可以使用自動完成也是如下:

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

是。 而是使用C風格的繼承,使用C ++風格:

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

struct str2 : public str3{
  object2 name;
};

第一句話。 這個

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

定義一個對象str3,而不是一個str3類型。

你可以使用繼承來實現你想要的,但我建議你改變你的結構數量

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


struct str2 : public str1
{
  object1 name;
};  

這樣做的原因是,如果要發生結構的chnge,我希望保持數據的完整性

為了實現這一目標,我寧願使用適當的封裝,訪問器和繼承來使用戶代碼中的布局更改不可見:

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_; }
};

我不確定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;
}

不要使用愚蠢的技巧來避免適當的重構。 它可以節省你一點點打字,但它會咬你的...后來。 如果編輯很復雜,那么你使用的是錯誤的工具和/或你的命名方案不好(1個字母的名稱很難找到/替換)。

你可以用GCC做到這一點,因為其他海報提及 ,但除了這一點,你可以使用-fms-extensions標記允許您使用前面定義的struct為未命名字段。

更多這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM