拥有具有私有类型的公共成员有什么意义吗?

Is there any point in having a public member with a private type?

提问人:saxbophone 提问时间:6/6/2022 最后编辑:saxbophone 更新时间:6/6/2022 访问量:196

问:

请考虑以下 C++ 代码,其中 member 具有私有类型:foo

class Object {
private:
    struct MyPrivateThing {
        long double Member;
    };
    using Type = MyPrivateThing;
public:
    Type foo = {32.45L};
    // MyPrivateThingFoo also works
};

int main() {
    // Object::Type f = {34.567L}; ERROR: Object::Type is private
    decltype(Object::foo) thingy = {945.67L}; // Fine
    auto x = Object().foo;
    return x.Member * thingy.Member;
}

虽然这段代码是合法的 C++ 并且编译良好,但它似乎有点违反直觉——是私有的,不能在类外访问,但我们仍然可以通过使用来间接引用它来获取该类型的变量。Object::Typeauto

似乎更直接的做法是让每个公共成员都有一个公共类型。

你能想到这种模式的任何有效用例吗?

使用 access-specifier C++ OOP 类型

评论

1赞 Sam Varshavchik 6/6/2022
如果您想在其他地方创建该类型的实例,您认为这是可能的吗?
1赞 prapin 6/6/2022
我认为使用私有类型的公共方法没有意义。至少我从来没有用过它。但我很好奇,看看这对其他人是否有意义。
2赞 Adrian Mole 6/6/2022
是私有的,但别名类型()不是。一个目的(代码中的注释似乎验证了这一点)是混淆 IDE 扩展,例如 IntelliSense(但有很多方法可以做到这一点)。long double
2赞 Raymond Chen 6/6/2022
@AdrianMole 另一个目的只是保存在头文件中的键入,而不使别名成为接口协定的一部分。 返回类型只是为了节省在头文件中的键入,他们为内部目的创建别名。private: using abc = Annoyingly::Bloviated::Concept; public: abc GetConcept();Annoyingly::Bloviated::Conceptabc
1赞 Adrian Mole 6/6/2022
@RaymondChen 听起来像是一个普通的Microsoft把戏。:-)

答: 暂无答案