c++ - 关于类互动的问题

标签 c++ oop

我有如下类

class A
{
 private:
   B b;
}

class B
{
private:
  C c;
  D d;

}

C和D是存储类,主要包含结构和数据结构。 B 将两者包裹在一起。我想知道如果我有对象 A,获取数据 C 和 D 或执行函数的更好方法是什么?

 For example:
 class A
{
 private:
   B b;
 public:
   B* GetB() { return &b;} 
};

class B
{
private:
  C c;
  D d;
public:
  C* GetC() {return &c;}
  D* GetD() {return &d;}
};

class C
{
 public:
  functionA();
};


A a;
B* b = a.GetB();
C* c = b->GetC();
c->functionA();

我根本不应该公开对象 B:

 class A
{
 private:
   B b;
 public:
   C* GetC() { return &b.GetC();} 
   D* GetD() { return &b.GetD();}
};

A a;
C* c = a.GetC();
c->functionA();

我不应该公开对象 B、C 和 D

 class A
{
 private:
   B b;
 public:
   void performFunctionA() { b.performFunctionA(); }
};

class B
{
private:
  C c;
  D d;
public:
  void performFunctionA() { c.functionA();}
};

class C
{
 public:
  functionA();
};


A a;
a.performFunctionA();

为什么我们要选择一个而不是另一个?

谢谢

最佳答案

良好的封装意味着您应该尽可能少地公开实现细节。在您的情况下,这意味着支持您的最后一个选项并且不公开 BCD。这样,BCD 的任何更改都可以与 A 的用户隔离。

关于c++ - 关于类互动的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6301496/

相关文章:

java - Java 与 Python 中的类方法调用(一般 OO 问题)

perl - 在 Perl 中初始化对象

java - 在实例化抽象类时,我的 OOP 设计是否存在缺陷?

c++ - 函数指针 - 模糊符号错误

c++ - 函数重载,无法推导出模板参数

c++ - 为通过 Nuget 安装的 C++ 库设置链接类型

c++ - VS 2013 OpenCV错误: Cannot find or open the PDB file

C++ 异常处理中的 Else 语句

class - 基类中工厂方法的 typescript 返回类型

Java - 如何避免仅为特定类需求创建setter?