0
class A {
public:
    A();
    int get();
    void set();
};

protected int A::var;

似乎它会工作。但是,它“在受保护之前期望一个不合格的 id”。这样做的正确方法是什么?

4

3 回答 3

6

简而言之,不,这是不可能的。

用复杂的话来说,这是不可能的,因为标准protected只允许在类定义中使用关键字和访问说明符。

于 2012-05-05T15:18:58.453 回答
6

编译器如何知道要为类的实例分配多少空间?考虑

A foo;
protected int A::var;
A bar;

编译器如何知道在分配空间var时分配空间foo?第一行和第二行甚至可以在不同的翻译单元中。

所以,不,这是不可能的,因为它没有意义。

于 2012-05-05T15:21:57.513 回答
0

没有办法完全按照您的意愿去做(正如其他人所说),但是如果您只是不想向您班级的用户透露protected/private成员,那么围绕这个有“黑客”。您可以创建一个PrivateBasePublicBase类,然后创建一个使用多重继承或组合前两个类的第三个类。通常,这样做是因为您想要分发头文件但又不想透露所有私人成员。

这是一个例子。我相信斯科特迈耶斯在他的一本书中也有一个例子。这是更多的工作,并使您的维护更加复杂,所以请记住这一点。

于 2012-05-05T15:24:41.470 回答