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

时间:2010-05-18 20:54:22

标签: 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" };

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
}

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:2)

其余成员将初始化为'0',而不是“默认”,对吧?所以它可能试图调用SomeObject(0),我猜这是解析为私有拷贝构造函数。

答案 2 :(得分:1)

看起来SomeObject的构造函数是私有的。