如果我有两个类,例如如下:
class A {...}
class B {...}
如果我想将课程A
公开上课B
,我是否只将A
班的成员公开,或者我可以使用public class A {...}
?
有没有办法告诉班级B
,例如只有班级A
是公开的?换句话说,我可以将公共课程设为A
受保护或私人给他人吗?或者,这只是派生一个类(继承)的问题?
感谢。
答案 0 :(得分:17)
将课程公开并公开其内容之间存在重大差异。
如果您在包含文件(.h文件)中定义您的类,那么您将公开您的类。包含此包含文件的每个其他源文件都将了解此类,并且可以例如指向它。
将类设为私有的唯一方法是将其定义放在源(.cpp)文件中。
即使您将课程公开,也不一定要公开课程内容。以下示例是一个极端的例子:
class MyClass
{
private:
MyClass();
~MyClass();
void setValue(int i);
int getValue() const;
};
如果将此定义放在include文件中,则每个其他源都可以引用(具有指针)此类,但由于该类中的所有方法都是私有的,因此没有其他源可以构造它,破坏它,设置它的价值或得到它的价值。
通过将类中的方法放在类定义的“public”部分中,可以使类的内容成为公共类,如下所示:
class MyClass
{
public:
MyClass();
~MyClass();
int getValue() const;
private:
void setValue(int i);
};
现在每个人都可以构造和破坏这个类的实例,甚至可以获得价值。但是,设置值不公开,因此没有人能够设置值(类本身除外)。
如果你想让这个类只对你的应用程序的其他类公开,而不是对完整的应用程序,你应该声明其他类是朋友,例如:
class SomeOtherClass;
class MyClass
{
friend SomeOtherClass;
public:
MyClass();
~MyClass();
int getValue() const;
private:
void setValue(int i);
};
现在,SomeOtherClass可以从MyClass访问所有私有方法,因此它可以调用setValue来设置MyClass的值。所有其他课程仍然限于公共方法。
不幸的是,C ++中没有办法只将一部分类公开给一组有限的其他类。因此,如果您将另一个类设为朋友,则可以访问所有私有方法。因此,限制朋友的数量。
答案 1 :(得分:3)
你可以使用友谊。
class A { friend class B; private: int x; };
class B { B() { A a; a.x = 0; // legal };
答案 2 :(得分:3)
如果B与A有很强的相互依赖关系,我建议您使用嵌套类。幸运的是,嵌套类可以是受保护的,也可以是私有的。
class A {
protected:
// the class A::B is visible from A and its
// inherited classes, but not to others, just
// like a protected member.
class B {
public:
int yay_another_public_member();
};
public:
int yay_a_public_member();
};