[英]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
我進行了一些搜索,據我所知,除非我有C ++ 11支持或想使用Boost庫,否則我必須定義一個輔助函數來初始化初始化列表中的const結構( C ++常數結構成員initialize ),但是我必須定義一個相似的結構似乎很瘋狂,但是使用非const字段來初始化帶有const字段的結構,不是嗎?
我發現的另一件事告訴我,我應該在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.