如何在不使代码效率低下的情况下尊重 c++ 中的封装原则?

How to respect encapsulation principles in c++ without making the code unefficient?

提问人:alex 提问时间:5/18/2022 更新时间:5/18/2022 访问量:46

问:

我是 C++ 编程的新手,我正在用 C++ 开发一个项目。 我对所有 OOP 原则(如封装和继承)都很陌生,因此我对如何在特定结构中正确设计代码表示怀疑。 例如,假设我必须定义一个这样的结构:

class c1;
class c2;

class MyCl{
public:
  MyCl();
  // many access methods...
  //...
  //...
private:
  std::string _title;
  int _version;
  std::vector<c1> _vec;
  // other private members
}

class c1{
public:
  c1();
  // many access methods
private:
  std::vector<c2> _vec;
  // other private members
}

class c2{
public:
  c2();
  //many access methods
private:
  std::vector<std::string> _vec_str;
  // other private members
}

现在假设我们有一个 MyCl 对象,我们想修改向量_vec_str中所有字符串中的单个字符串,该字符串位于结构体 (c2) 中暴露最少的部分。 那么,在这种情况下,修改该字符串的最佳选择是什么?返回 const& 似乎效率低下,因为为了修改单个字符串,我们必须复制所有结构两次(一次用于 getter,一次用于 setter)和每个子类。另一方面,返回 & 或指针更有效,因为它允许直接访问所有结构,但它不尊重封装原则。

C++ OOP 按引用传递 封装

评论

2赞 Nathan Pierson 5/18/2022
如果不了解这些类的实际作用,那么谈论如何有效地封装它们以及它们公开的接口应该是什么就有点毫无意义了。
1赞 molbdnilo 5/18/2022
你想要“错误”的东西 - 甚至不应该知道在深处的某个地方有一个可以修改的字符串向量。 并且应该公开不会泄露实现细节的变异函数; 应该要求 A 做某事,而这反过来又应该要求 A 做某事。(如果你有“很多”访问器,你很可能走错了路。MyClc1c2MyClc1c2
0赞 pptaszni 5/18/2022
请修改问题并解释特定类的目的是什么,最好只是一个,以避免冗长无意义的代码示例。目前我只能说“视情况而定”。例如:像“点”这样的简单实体可能更好,而复杂的几何图形可能更好,因为带有访问器和计算不同参数(例如面积)的方法。struct Point{ T x, T y };class Rectangle

答: 暂无答案