使用类成员静态初始化结构

JSB*_*ոգչ 4 c++ constructor struct static-initializer

我有一个用大量香草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" };
Run Code Online (Sandbox Code Playgroud)

SomeObject有一个没有参数的公共默认构造函数,所以我不认为这会是一个问题.但是当我尝试编译它(使用VS)时,我收到以下错误:

error C2248: 'SomeObject::SomeObject' : cannot access private member declared in class 'SomeObject'
Run Code Online (Sandbox Code Playgroud)

知道为什么吗?

更新:这是SomeObject的定义

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

    // members snipped
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*edy 5

您的初始化ex执行复制初始化.它取右边的值并用它来初始化左边的变量.对于类类型成员,使用适当的构造函数.在您的情况下,这意味着调用复制构造函数SomeObject,但您已将该构造函数SomeObject::SomeObject设为私有,因此编译器在告诉您这是一个无法访问的私有成员时是正确的.

虽然允许编译器忽略对复制构造函数的调用ex.obj使用默认构造函数直接初始化,但这是一个可选的优化; 它仍然需要被允许调用复制构造函数.

您可以给example_struct自己的构造函数并使用它来代替大括号初始化,也可以公开SomeObject复制构造函数.