我有一个用大量普通 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
}
最佳答案
ex
的初始化执行复制初始化。它获取右侧的值并使用它来初始化左侧的变量。对于类类型成员,使用适当的构造函数。在您的情况下,这意味着调用 SomeObject
的复制构造函数,但是您已将该构造函数设为私有(private),因此编译器告诉您 SomeObject::SomeObject
是正确的无法访问的私有(private)成员。
尽管允许编译器省略对复制构造函数的调用并直接使用默认构造函数初始化ex.obj
,但这是一个可选的优化;仍然需要允许调用复制构造函数。
您可以给 example_struct
一个您自己的构造函数并使用它来代替大括号初始化,或者您可以公开 SomeObject
的复制构造函数。
关于c++ - 具有类成员的结构的静态初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2861101/