C++ 具有类成员的结构的静态初始化

C++ 具有类成员的结构的静态初始化,c++,constructor,struct,static-initializer,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

我有一个定义了大量香草
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
}

似乎SomeObject的构造函数是私有的。

其余成员将被初始化为“0”,而不是“默认值”,对吗?因此,它可能试图调用
SomeObject(0)
,我猜它正在解析为私有副本构造函数。

您的
ex
初始化执行副本初始化。它获取右侧的值并使用它初始化左侧的变量。对于类类型成员,使用适当的构造函数。在您的例子中,这意味着调用
SomeObject
的复制构造函数,但您已将该构造函数设置为私有的,因此编译器正确地告诉您
SomeObject::SomeObject
是无法访问的私有成员

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


你可以给
example\u struct
一个你自己的构造函数,并用它代替大括号初始化,或者你可以公开
SomeObject
的复制构造函数。

“SomeObject有一个没有参数的公共默认构造函数”,在C++中声明一个结构的正常方法是只做一个类(除了使用<代码>结构> <代码>而不是<代码>类< /C> >,而跳过整个TyPyFF对象。你在C中被卡住了,但是C++没有必要。