4

多数のバニラ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引数のない public デフォルト コンストラクターがあるため、これが問題になるとは思いませんでした。しかし、これを (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
}
4

3 に答える 3

5

の初期化はcopy-initializationex実行します。右側の値を取得し、それを使用して左側の変数を初期化します。クラス型メンバーの場合、適切なコンストラクターが使用されます。あなたの場合、それは のコピーコンストラクターを呼び出すことを意味しますが、そのコンストラクターをプライベートにしたため、コンパイラーはアクセスできないプライベートメンバーであることを正しく伝えています。SomeObjectSomeObject::SomeObject

コンパイラはコピー コンストラクターの呼び出しex.objを省略し、既定のコンストラクターで直接初期化することができますが、これはオプションの最適化です。コピー コンストラクターの呼び出しを許可する必要があります。

example_struct独自のコンストラクターを指定してブレースの初期化の代わりに使用するか、 のコピー コンストラクターを公開することができますSomeObject

于 2010-05-18T21:43:02.240 に答える
2

残りのメンバーは「デフォルト」ではなく「0」に初期化されますよね?したがって、おそらく を呼び出そうとしていますがSomeObject(0)、これはプライベートコピーコンストラクターに解決されていると思います。

于 2010-05-18T21:28:41.007 に答える
1

SomeObject のコンストラクターはプライベートのようです。

于 2010-05-18T20:58:06.863 に答える