This question already has answers here:
Why can I use auto on a private type?
(4个答案)
在6个月前关闭。
大家早上好,
我正在尝试编写OUTER_CLASS类的成员函数,该函数将unique_ptr返回到OUTER_CLASS本身定义的私有(private)类INNER_CLASS。我的意图是编写一个工厂方法,该方法返回对接口(interface)类的引用,该接口(interface)类允许与从客户端隐藏的实现类进行交互。除了设计选择,我还有一个编译问题:给出以下代码片段,这是我的体系结构的非常简化的版本
我收到以下错误:
相反,如果我使用自动类型推演,写
一切都很好...
这怎么可能?我究竟做错了什么?
预先感谢您的任何回答
给定
(4个答案)
在6个月前关闭。
大家早上好,
我正在尝试编写OUTER_CLASS类的成员函数,该函数将unique_ptr返回到OUTER_CLASS本身定义的私有(private)类INNER_CLASS。我的意图是编写一个工厂方法,该方法返回对接口(interface)类的引用,该接口(interface)类允许与从客户端隐藏的实现类进行交互。除了设计选择,我还有一个编译问题:给出以下代码片段,这是我的体系结构的非常简化的版本
#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
| ^~~~~~~~~~
相反,如果我使用自动类型推演,写
int main()
{
OuterClass obj;
auto innerObj = obj.CreateInnerClass();
innerObj->myPrint();
}
一切都很好...
这怎么可能?我究竟做错了什么?
预先感谢您的任何回答
最佳答案
Accessibility适用于名称,而不适用于所引用的类型。因此,您不能直接在OuterClass::InnerClass
中使用名称main()
,但仍可以使用类型,例如在返回类型为OuterClass::InnerClass
的返回对象上调用成员函数
obj.CreateInnerClass()->myPrint();
给定
auto innerObj = obj.CreateInnerClass();
,名称OuterClass::InnerClass
不会直接使用,那么它不会违反可访问性检查。出于同样的原因,您也可以使用decltype
,即使它看起来很多余。例如。decltype(obj.CreateInnerClass()) innerObj = obj.CreateInnerClass();
关于c++ - 内部类引用的编译问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62190760/
10-12 01:28