这是一个关于将类定义为公共或私有的问题。
现在,我在命名空间内定义了各种类,我只希望这些类的某些对外界可见/可用。
因此,例如,如果下面的类是程序中唯一的类,我希望main.cpp只能看到/使用MyPublic类,而不是MyPrivate类。我认为将MyPrivate类定义为private并将MyPublic类定义为public将完成此操作,但下面的代码可以正常工作,main.cpp可以声明MyPrivate对象。
是否可以在C ++中执行此操作?
MyPrivate.h:
namespace MyNamespace{
// only classes inside of the MyNamespace should be able
// to use this
private ref class MyPrivate{
...
};
}
MyPublic.h:
#include "MyPrivate.h"
namespace MyNamespace {
// anyone can declare this
public ref class MyPublic{
...
private:
MyNamespace::MyPrivate^ p;
...
};
}
Main.cpp的:
#include "MyPublic.h"
int main(){
MyNamespace::MyPublic p_yes; // this is fine
MyNamespace::MyPrivate p_no; // don't want this to be possible
return 0;
}
答案 0 :(得分:3)
namespace MyNamespace { public ref class MyPublic { private: ref class MyPrivate { public: int x; }; MyPrivate^ p; }; }
//编辑:
顺便说一句,你仍然可以在public:
部分中抛出这个嵌套类,并像这样使用它:
MyNamespace::MyPublic::MyPrivate priv;
答案 1 :(得分:1)
private关键字意味着你想象的其他东西。我将ref类的可见性限制在程序集之外。由于您的Main()方法在同一个程序集中,因此引用类型名称没有任何问题。请注意,C#语言的“内部”关键字意味着相同的事情。
我认为你真的打算让这些类有一天在一个单独的程序集中。因此,使用私有肯定是足够好的。使用嵌套的私有类可以使类在同一个程序集中无法访问。
答案 2 :(得分:0)
您的公共标头不应包含私有标头。转发声明私有类并仅在MyPublic.cpp中包含标头。或者,如果您使用普通的C ++,那就是我所说的。 Bastardized .Net方言可能会改变一切。
答案 3 :(得分:0)
不幸的是,类上的访问修饰符只会影响您正在构建的程序集之外的可见性。 C ++不支持以您描述的方式应用于命名空间的任何类型的访问修饰符。
模拟此问题的常用习惯是将“私有”代码放入detail
命名空间(例如将其放入MyNamespace::detail
)。这在例如使用中很多。升级库。按照惯例,详细命名空间中的代码只能由封闭命名空间中的代码使用(因此MyNamespace::detail
只应由MyNamespace
中的代码使用),尽管编译器不会为您强制执行此操作。