gpt4 book ai didi

c++ - 不应该禁止访问私有(private)类型吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:31 25 4
gpt4 key购买 nike

考虑这段代码:

class A
{
struct B {};
std::vector<B> _vec;

public:
const std::vector<B>& get() const { return _vec; }
};

请注意,B 在类 A 中是私有(private)的。上面的代码可以编译,但是当从 A 类外部调用 get() 时,它不会:

const std::vector<A::B>& vec = get(); // does not compile

确实,A::B私有(private)的。但是,从 C++11 开始,您可以简单地这样做:

const auto& vec = get();

完美运行。

出于与上述相同的原因,您不能执行以下操作:

A::B obj; 

但是,由于有一个 public getter,您可以从该 getter 函数中推断出类型。在这种特殊情况下,可以这样做:

using B = std::decay<decltype(C{}.get())>::type::value_type;
B obj;

问题

我不确定如何表述我的问题。我觉得奇怪的是,从 C++11 开始(而不是之前),我们实际上可以将 A::B 实例化为后者 private。更重要的是,我认为我们可以调用 const auto& get() 很奇怪。对此有什么解释吗?不允许这样做不是更好吗?我应该声明 A::B public 吗?如果您需要像上面代码中那样的 getter 函数,我觉得将它声明为 private 是没有意义的。

最佳答案

It seems strange to me that, from C++11 on (and not before), we actually can instantiate A::B being the latter private.

你可以在 C++98/03 中通过模板参数推导很好地做到这一点:

template<typename T>
void temp_func(const T &t)
{
...
T u = t;
}

temp_func(a.get()); //Will use the private type.

您甚至可以使用 T temp_func 内部.

将类型设为私有(private)永远不能保证该类型无法从外部访问。 Private 始终指的是名称 的可访问性,而不是名称背后的结构的可访问性。如果您希望一个类型只在一个范围内使用,那么该类型名称不能是任何非私有(private)接口(interface)的一部分。情况一直如此。

Should I declare A::B public?

这取决于你。但是,如果您公开一个公共(public)用户界面,您就是在声明用户可以使用该界面。为了让用户知道如何使用 vector<A::B> , 他们必须知道如何 A::B表现。所以他们必须使用它的定义。即使它是私有(private)的。

因此,如果用户必须了解某个类型以及该类型的行为方式……它真的是“私有(private)”的吗?

关于c++ - 不应该禁止访问私有(private)类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57823143/

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