使类对 C++ 中的其他类公开

Posted

技术标签:

【中文标题】使类对 C++ 中的其他类公开【英文标题】:Making classes public to other classes in C++ 【发布时间】:2011-06-15 02:58:59 【问题描述】:

如果我有两个类,例如如下:

class A ...

class B ...

如果我想将A 类公开给B 类,我是只公开A 类的成员还是只使用public class A ...

有没有办法告诉B 类,例如只有A 类对你是公开的?换句话说,我可以将A 的公共课程设置为受保护的或私人的吗?或者,这只是派生类(继承)的问题?

谢谢。

【问题讨论】:

你应该拿一本好的 C++ 书。有很多 SO 线程可以为您提供建议。 【参考方案1】:

将课程公开和公开其内容之间有很大的区别。

如果您在包含文件(.h 文件)中定义您的类,那么您就是在公开您的类。包含此包含文件的所有其他源文件都将了解此类,并且可以例如有一个指向它的指针。

将类设为私有的唯一方法是将其定义放在源 (.cpp) 文件中。

即使您公开了课程,也不一定必须公开课程的内容。下面的例子是一个极端的例子:

class MyClass
   
   private:
      MyClass();
      ~MyClass();
      void setValue(int i);
      int getValue() const;
   ;

如果这个定义放在一个包含文件中,所有其他源都可以引用(有一个指向)这个类,但是由于类中的所有方法都是私有的,没有其他源可以构造它、破坏它、设置它它的价值或得到它的价值。

您可以通过将类中的方法放入类定义的“公共”部分来公开类的内容,如下所示:

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++ 中没有办法只将你的类的一部分公开给有限的一组其他类。所以,如果你让另一个类成为朋友,它就可以访问所有私有方法。因此,限制朋友的数量。

【讨论】:

当你写:int getValue() const;时,const这里的意思是:将值作为常量返回吗?谢谢。 const表示方法不会改变实例本身,所以getValue不会改变你调用getValue的MyClass实例。一般来说,一个 const 返回值(如“const int getValue();”)是没有意义的。有意义的是,如果您返回一个指针,该指针指向一个 const 值(如“const char *getName()”)。【参考方案2】:

你可以使用友谊。

class A  friend class B; private: int x; ;
class B  B()  A a; a.x = 0; // legal ;

【讨论】:

@DeadMG。这是友谊的另一种形式:“B类:公共A”吗?谢谢。 @user588855,不,是inheritance。 @DeadMG。那么,我们怎样才能上公开课呢?在类名前使用关键字“public”是否正确? @user588855,在 C++ 中,类没有可访问性限制(例如在 Java 或 C# 中),仅适用于类成员。所以public class X ... ; 不是有效的 C++。如果你#import 它的头文件,一个类对另一个类可见。 正如 DeadMG 告诉你的那样。不,在 class 关键字之前写 public 不是 C++。【参考方案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();
;

【讨论】:

以上是关于使类对 C++ 中的其他类公开的主要内容,如果未能解决你的问题,请参考以下文章

使类可迭代尊重继承

C ++:使类及其某些数据成员仅在命名空间中可用

如何在 XAML 中公开控件以便在其他类中看到

C++ 使用类对列上的 2d 向量进行排序失败(带比较功能的问题)

向其他文件中的现有 C++ 类添加方法

我想将一个对象中的一个对象调用到 c++ 中的其他类