4

我有一个用大量 vanillachar*指针定义的结构,但也是一个对象成员。当我尝试静态初始化这样的结构时,出现编译器错误。

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
}
4

3 回答 3

5

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