gpt4 book ai didi

c++ - 防止返回私有(private)内部类实例

转载 作者:IT老高 更新时间:2023-10-28 21:35:30 25 4
gpt4 key购买 nike

我一直在玩C++中的内部类,现在我有点困惑。

我的代码:

#include <iostream>

class outer{
private:
class inner{
private:
int something;
public:
void print(){
std::cout<< "i am inner"<<std::endl;
}
};
public:
inner returnInner(){
inner i;
return i;
}
};

int main(){
outer o;
//outer::inner i = o.returnInner(); (1)
//auto i = o.returnInner(); (2)
//i.print();
o.returnInner().print(); //(3)
return 0;
}

这是在 Linux 上使用 clang++-3.5-std=c++14 编译的。

  • (1) 中,我遇到了预期的编译器错误,因为 innerouter 的私有(private)内部类。

  • 但是,在(2)中,当使用auto关键字时,编译成功,程序运行。

  • 一切都适用于 (3)

我的问题:

为什么会这样?我可以防止从外部方法返回私有(private)内部类的实例,同时保留在外部类中移动和/或复制它们的能力吗?

编译器不应该像 (1) 中那样在 (2)(3) 中引发错误吗? p>

最佳答案

why is it so Shouldn't compiler return error in (2) and (3) as in (1)?

这是一个有趣的问题.. 这个问题的答案更有趣。

在您发布的代码中,inner是一个类型的namename 被声明为 private,而不是 type 本身1 - 的可访问性type 在 C++ 的上下文中没有意义;可访问性仅适用于 name — 类型的 name、函数的 name、数据的 name。所以当你听到“类型 X 是一个公共(public)类”之类的东西时,它几乎总是意味着 “名称 X 被声明为公共(public)的,它指的是一个类型,而类型是无所不在,无处不在”

回到为什么使用 auto 不会出错,因为当您使用 auto 时,您访问的是 type 而没有使用它的名字,这就是它不报错的原因。

how can i prevent return of an instance of private inner class from outer methods,

没有办法。


1. struct { int 数据; } 是一个 type,没有要引用的 name,但请注意这不是一个有效的声明,因为它缺少 name .要么你必须声明一个 unnamed 类型的对象,如 struct { int data; } obj; 或者将其命名为 struct data_type { int data; };

关于c++ - 防止返回私有(private)内部类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31185119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com