【问题标题】:Compiling Issue with Inner class reference [duplicate]内部类引用的编译问题[重复]
【发布时间】:2020-06-04 09:03:11
【问题描述】:

大家早上好, 我正在尝试编写一个类 OUTER_CLASS 的成员函数,它将一个 unique_ptr 返回到在 OUTER_CLASS 本身中定义的私有类 INNER_CLASS。我的意图是编写一个工厂方法,该方法返回对接口类的引用,该接口类允许与对客户端隐藏的实现类进行交互。除了设计选择之外,我还有一个编译问题:给定以下 sn-p 代码,这是我架构的一个非常简化的版本


#include <iostream>
#include <string>
#include <vector>
#include <memory>

using namespace std;

class OuterClass
{
    class InnerClass
    {
        friend class OuterClass;        
        public:
            void myPrint() { cout << "Inner Class " << a << endl;}
            InnerClass(int inA) : a(inA) {};
        private:
            int a;
    };
public:
    std::unique_ptr<InnerClass> CreateInnerClass()
    {
        std::unique_ptr<InnerClass> innerObj;
        innerObj.reset(new InnerClass(1));
        return innerObj;
    }
};


int main()
{
    OuterClass obj;
    std::unique_ptr<OuterClass::InnerClass> innerObj = obj.CreateInnerClass();    
    innerObj->myPrint();
}

我收到以下错误:

main.cpp: In function 'int main()':
main.cpp:43:10: error: 'class OuterClass::InnerClass' is private within this context
   43 |     std::unique_ptr<OuterClass::InnerClass> innerObj = obj.CreateInnerClass();
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:20:11: note: declared private here
   20 |     class InnerClass
      |           ^~~~~~~~~~

如果我改为使用AUTO类型推导,写

int main()
{
    OuterClass obj;
    auto innerObj = obj.CreateInnerClass();    
    innerObj->myPrint();
}

一切都好... 这怎么可能?我究竟做错了什么? 提前感谢您的任何回答

【问题讨论】:

  • 要在 OuterClass 之外使用 InnerClass,您必须公开 OuterClass 中的定义

标签: c++


【解决方案1】:

Accessibility 应用于名称,而不是被引用的类型。所以你只是不能在main()中直接使用名称OuterClass::InnerClass,但你仍然可以使用类型为OuterClass::InnerClass的返回对象调用成员函数之类的类型

obj.CreateInnerClass()->myPrint();

鉴于auto innerObj = obj.CreateInnerClass(); 名称OuterClass::InnerClass 不直接使用,那么它不会违反可访问性检查。出于同样的原因,您也可以使用decltype,即使它看起来是多余的。例如

decltype(obj.CreateInnerClass()) innerObj = obj.CreateInnerClass(); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 2012-11-09
    • 2014-03-07
    相关资源
    最近更新 更多