簡體   English   中英

使用類成員靜態初始化結構

[英]Static initialization of a struct with class members

我有一個結構,它使用大量的vanilla char*指針定義,但也是一個對象成員。 當我嘗試靜態初始化這樣的結構時,我得到編譯器錯誤。

typedef struct 
{
    const char* pszA;
    // ... snip ...
    const char* pszZ;

    SomeObject obj;
} example_struct;

// I only want to assign the first few members, the rest should be default
example_struct ex = { "a", "b" };

SomeObject有一個沒有參數的公共默認構造函數,所以我不認為這會是一個問題。 但是當我嘗試編譯它(使用VS)時,我收到以下錯誤:

error C2248: 'SomeObject::SomeObject' : cannot access private member declared in class 'SomeObject'

知道為什么嗎?

更新:這是SomeObject的定義

class SomeObject
{
    void operator=(const SomeObject&);
    SomeObject(const SomeObject&);
public:
    SomeObject()
        {
            // etc
        }

    // members snipped
}

ex 的初始化執行復制初始化 它取右邊的值並用它來初始化左邊的變量。 對於類類型成員,使用適當的構造函數。 在您的情況下,這意味着調用SomeObject的復制構造SomeObject ,但您已將該構造函數SomeObject私有,因此編譯器在告訴您SomeObject::SomeObject是無法訪問的私有成員時是正確的。

雖然允許編譯器ex.obj對復制構造函數的調用並使用默認構造函數直接初始化ex.obj ,但這是一個可選的優化; 它仍然需要被允許調用復制構造函數。

您可以為example_struct提供自己的構造函數,並使用它來代替大括號初始化,也可以公開SomeObject的復制構造函數。

其余的成員將初始化為'0',而不是“默認”,對吧? 所以它可能試圖調用SomeObject(0) ,我猜這是解析為私有拷貝構造函數。

看起來SomeObject的構造函數是私有的。

暫無
暫無

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

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