1

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

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

因此,例如,如果下面的类是程序中唯一的类,我希望 main.cpp 只能看到/使用 MyPublic 类,而不是 MyPrivate 类。我认为将 MyPrivate 类定义为 private 并将 MyPublic 类定义为 public 可以实现这一点,但是下面的代码有效并且 main.cpp 能够声明一个 MyPrivate 对象。

是否可以在 C++ 中做到这一点?

我的私人.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;
        ...
    };
}

主要.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

4 回答 4

3

在这种情况下,私有/公共将影响类在程序集外的可见性,如果要创建一个“私有”类,即它只能由其他类使用,则可以使用嵌套 clas 机制,例如这:

命名空间 MyNamespace {
    公共参考类 MyPublic {
       私人的:

           参考类 MyPrivate {
               上市:
               诠释 x;
           };

           我的私人^ p;
    };
}

//编辑:顺便说一句,您仍然可以在public:部分中抛出这个嵌套类并像这样使用它:
MyNamespace::MyPublic::MyPrivate priv;

于 2009-07-19T20:49:59.103 回答
1

private 关键字的含义与您想象的不同。我将 ref 类的可见性限制在程序集之外。由于您的 Main() 方法在同一个程序集中,因此引用类型名称没有问题。请注意,C# 语言的“internal”关键字含义相同。

我假设您真的打算有一天将这些类放在一个单独的程序集中。因此,使用 private 肯定足够好。使用嵌套的私有类可以使同一程序集中的代码无法访问类。

于 2009-07-19T21:04:35.020 回答
0

您的公共标头不应包含私有标头。仅在 MyPublic.cpp 中转发声明私有类和包含标头。或者如果你使用普通的 C++,这就是我要说的。混蛋的 .Net 方言可能会改变一些事情。

于 2009-07-19T20:56:57.327 回答
0

不幸的是,类上的访问修饰符只会影响您正在构建的程序集之外的可见性。C++ 不支持以您描述的方式应用于命名空间的任何类型的访问修饰符。

模拟这种情况的一个常见习惯用法是将“私有”代码放入detail命名空间(例如,将其放入MyNamespace::detail)。这在例如 boost 库中被大量使用。按照惯例,详细命名空间中的代码只能由封闭命名空间中的代码使用(因此MyNamespace::detail只能由 中的代码使用MyNamespace),尽管编译器不会为您强制执行此操作。

于 2009-07-19T20:58:21.147 回答