簡體   English   中英

類內部的C ++常量結構初始化

[英]C++ constant structure initialization inside a class

我應該如何為一個類編寫一個構造函數以初始化一個具有const結構/具有const字段的成員?

在以下示例中,我在結構B中定義了一個構造函數,並且可以很好地初始化其const字段。

但是,當我嘗試使用相同的技術在類A中初始化結構C的const字段時,它不起作用。 有人可以幫助我,並以某種方式重寫我的A類,使其開始起作用嗎?

#include <iostream>
class A
{
public:
    struct C
    {
            C (const int _x) : x (_x) {}
            const int x;
    };

    C c (3);

};
int main (int argc, char *argv[])
{
struct B
{
    B (const int _x) : x (_x) {}
    const int x;
};

B b (2);
std::cout << b.x << std::endl;

A a;
std::cout << a.c.x << std::endl;

return 0;
}

PS

  1. 我進行了一些搜索,據我所知,除非我有C ++ 11支持或想使用Boost庫,否則我必須定義一個輔助函數來初始化初始化列表中的const結構( C ++常數結構成員initialize ),但是我必須定義一個相似的結構似乎很瘋狂,但是使用非const字段來初始化帶有const字段的結構,不是嗎?

  2. 我發現的另一件事告訴我,我應該在A類的構造函數中初始化const成員,而不是在struct C的構造函數中初始化( C ++編譯時錯誤:數字常量之前的預期標識符 ),但對我來說,這似乎也很瘋狂,因為為什么每次我想添加一個新結構時都應該重寫一個類構造函數,為類A中的每個結構C分別設置一個構造函數不是更方便嗎?

我很感謝任何可能澄清我的困惑的評論。

我會做這樣的工作:

#include <iostream>
class A {
public:
    struct C {
        C(const int _x) : x(_x) {}
        const int x;
    };

    C c; // (3);
    A() : c(3) {}
};
int main(int argc, char *argv []) {
    A a;
    std::cout << a.c.x << std::endl;

    return 0;
}

請注意,這不是在A C中使用ctor的問題,而是A的ctor告訴應如何調用C的ctor的問題。 如果將要傳遞的值始終為3 ,則沒有必要,但是我假設您希望能夠在創建C對象時傳遞您選擇的值,並且此后它將保持不變。

如果該值始終相同(在這種情況下為3 ),則可以通過使常量為static來簡化很多事情:

struct A {
    struct C {
        static const int x = 3;
    };
    C c;
};

int main() { 
    A a;
    std::cout << a.c.x << "\n";
}

因此,如果該類的所有實例的值都相同,則將其static const ,就地對其進行初始化,這樣一來,生命就很好了。 如果在創建對象實例之前未知該值,並且此后在該對象的生存期內保持不變,則需要將其傳遞給構造函數。

對於稍微不同的情況,還有第三種可能性:如果C是一個獨立的類(未嵌套在A ),則可能會遇到C其他實例使用各種值,但A內的所有C實例始終使用相同值的情況。值。 在這種情況下,您可以執行以下操作:

struct C { 
    const int x;

    C(int x) : x(x) {}
};

struct A { 
     C c;

     A() : c(3) {}
};

當然,當C嵌套在A內時,您可以執行相同的操作,但是當/如果這樣做,則通常意味着您要為C所有實例設置相同的值,因此您最好使用static const方法。代替。 一個明顯的例外是,如果A有多個構造函數,那么(例如) A的默認構造函數為C::x傳遞一個值,而其副本構造函數傳遞一個不同的值。

暫無
暫無

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

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