名称空间问题中的私有/公共类

时间:2009-07-19 20:42:11

标签: namespaces managed-c++

这是一个关于将类定义为公共或私有的问题。

现在,我在命名空间内定义了各种类,我只希望这些类的某些对外界可见/可用。

因此,例如,如果下面的类是程序中唯一的类,我希望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;
}

4 个答案:

答案 0 :(得分:3)

在这种情况下,私有/公共将影响类在程序集外可见的方式,如果你想创建一个“私有”的类,意思是它只能被其他类使用,你可以使用嵌套的clas机制,像这样:

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中的代码使用),尽管编译器不会为您强制执行此操作。