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

标签 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 有一个没有参数的公共(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/

相关文章:

struct - 使用闭包初始化带有字段的结构

c - 错误: argument of type "HNode *" is incompatible with parameter type "HNode *"

C++:我可以重用/将 std::list 元素从中间移动到末尾吗?

c++ - DLL 中的全局构造函数和 MSVCRT

Java构造函数脚本

php - Laravel 4 - 子构造函数通过依赖注入(inject)调用父构造函数

c - 以下 C 代码有什么问题 - 结构和指针

c++ - SIMD 与否 SIMD - 跨平台

c++ - 使用这种智能指针转换安全吗?

c++ - CMake在编译Google的protobuf示例时找不到protobuf