【问题标题】:C++ / CLI cannot access protected member of base classC++ / CLI 无法访问基类的受保护成员
【发布时间】:2014-01-26 13:25:07
【问题描述】:

我有这门课:

ref class Wrapper {
protected:
            Native *pn;

public:
            Wrapper(int val) { pn = new Native( val ); }

};

然后我从中得出:

ref class DerivedWrapper : public Wrapper{
public: 
    DerivedWrapper(int val) {pn = new DerivedNative(val); }
}

编译器抱怨: 错误 C2248 ‘ Wrapper::pn’ : 无法访问在类 ‘Wrapper’ 中声明的私有成员

基类本地指针被明确保护,派生类应该可以随时访问它。我所有的直觉告诉我这应该有效。 ref 类有什么特别之处吗?

我正在使用 VS 2008 SP 1 进行编译

【问题讨论】:

  • 这两个类是否在同一个程序集中?否则,不允许(直接)从基类 Assembly 导出 Native 的类型,编译器将隐式将其更改为私有。但如果发生这种情况,您会收到警告。
  • 为什么不在 DerivedWrapper 构造函数中调用基构造函数来初始化该字段?
  • 你需要公共参考类

标签: c++-cli


【解决方案1】:

在您的案例中,本机类型必须在编译的程序集本身中具有公共或受保护的可访问性。有一个特殊的make_public pragma 指令可以提升本机类型。将此添加到代码中:

#pragma make_public(Native)

make_public 杂注记录在 http://msdn.microsoft.com/en-us/library/ms235607.aspx

【讨论】:

    【解决方案2】:

    考虑在 Wrapper 的构造函数中初始化 pn,或者你需要为你的 Wrapper 提供默认构造函数。不要忘记 ref 类定义中的“public”。

    public ref class Wrapper {
    protected:
      Native *pn;
      Wrapper(Native * fpn):pn(fpn)
      {}
    public:
      Wrapper(int val) { pn = new Native( val ); }
    };
    
    ref class DerivedWrapper : public Wrapper{
    public: 
      DerivedWrapper(int val):Wrapper(new DerivedNative(val)){}
    };
    

    【讨论】:

      猜你喜欢
      • 2016-04-07
      • 2014-02-22
      • 2019-01-20
      • 2016-10-01
      • 2016-07-15
      • 2022-01-06
      • 2012-11-20
      • 1970-01-01
      相关资源
      最近更新 更多