c++ - 指针和面向对象编程

标签 c++ oop pointers responsibility

指针如何与面向对象编程的概念一起工作?

据我了解(请注意,我被归类为 ID-10T),OOP 的主要原则是包含并保持类中包含的管理责任(内存/实现/等);但是当一个对象的方法返回一个指针时,我们似乎在“弹出”这个对象。现在,有人可能需要担心:

  1. 他们应该删除指针的关联对象吗?
  2. 但是如果类仍然需要该对象怎么办?
  3. 他们能改变对象吗?如果是这样,如何? (我知道 const 可能会解决这个问题)
  4. 等等...

看来对象的用户现在需要很多了解类如何工作以及类对用户的期望。这感觉就像一个“猫的 secret ”场景,似乎是对 OOP 的一记耳光。

注意:我注意到这是一个与语言无关的问题;然而,当我在 C++ 环境中工作时,系统提示我提出这个问题。

最佳答案

您描述的是所有权问题。这些是正交的(即独立的,你可以没有另一个,甚至两个)面向对象。如果您不使用 OOP 并使用指向 POD 结构的指针,您会遇到同样的问题。如果你使用 OOP 但以某种方式解决它,你就没有问题。您可以(尝试)使用更多 OOP 或其他方式解决它。

它们也与指针的使用正交(除非你选择并扩展指针的定义)。例如,如果两个不同的位置将索引保存到数组中并改变、调整大小并最终删除数组,则会出现相同的问题。

在 C++ 中,通常的解决方案是选择正确的智能指针类型(例如,当您希望共享对象时返回共享指针,或表示独占所有权的唯一指针),以及大量文档。实际上,后者是任何语言的关键成分。

您可以做的一件与 OOP 相关的事情是封装(当然,您可以在没有 OOP 的情况下进行封装)。例如,根本不要公开对象,只公开在幕后查询对象的方法。或者不公开原始指针,只公开智能指针。

关于c++ - 指针和面向对象编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12164459/

相关文章:

C++ AMP : array_view and index behaving strangely (unexpected values stored)

javascript - 参数未通过两级 JavaScript 构造函数传递

oop - 每个公共(public)方法都被接口(interface)覆盖是一个好的做法吗?

c++ - 重载函数以接受模板指针变量

c++ - 在创建对象之前确保数据的唯一性?

c++ - 如何声明指向类对象的指针 vector ?

c++ - 模板 - 练习

c++ - OOP C++ - 错误,因为 A.h 包含 B.h,B.h 又包含 A.h

c - 指针和数组如何在c中互换使用

c - 如何使 "if"条件代表 C 中的所有结构项