代码之家  ›  专栏  ›  技术社区  ›  JSBÕ±Õ¸Õ£Õ¹

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

  •  4
  • JSBÕ±Õ¸Õ£Õ¹  · 技术社区  · 14 年前

    我有一个用大量香草定义的结构 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'
    

    你知道为什么吗?

    更新: 这是某个物体的定义

    class SomeObject
    {
        void operator=(const SomeObject&);
        SomeObject(const SomeObject&);
    public:
        SomeObject()
            {
                // etc
            }
    
        // members snipped
    }
    
    3 回复  |  直到 14 年前
        1
  •  5
  •   Rob Kennedy    14 年前

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

    尽管编译器可以删除 呼叫 复制构造函数并初始化 ex.obj 直接使用默认的构造函数,这是一个可选的优化;它仍然需要 允许 调用复制构造函数。

    你也可以给 example_struct 您自己的构造函数,并使用它来代替括号初始化,或者您可以公开 某物 的复制构造函数。

        2
  •  2
  •   AShelly    14 年前

    其余成员将初始化为“0”,而不是“默认”,对吗?所以它可能在打电话 SomeObject(0) ,我想是解析为私有副本构造函数。

        3
  •  1
  •   Nick Strupat    14 年前

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

    推荐文章