指针和面向对象的编程

时间:2012-08-28 17:28:53

标签: c++ oop pointers responsibility

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

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

  1. 他们是否应该删除指针的相关对象?
  2. 但如果班级仍然需要这个对象呢?
  3. 他们可以改变对象吗?如果是这样,怎么样? (我承认const可能会解决此问题)
  4. 依旧......
  5. 对象的用户现在需要知道更多更多关于类如何工作以及类对用户的期望。感觉就像是一只“淘汰猫咪”的情景,似乎在OOP面前拍了一下。

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

3 个答案:

答案 0 :(得分:5)

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

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

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

一个OOP- 相关的你可以做的事情来帮助这个封装(当然,你可以在没有OOP的情况下完成封锁)。例如,不要暴露对象,只暴露查询引擎下的对象的方法。或者不暴露原始指针,只暴露智能指针。

答案 1 :(得分:1)

对于初学者......如果没有指针或者你就不能拥有多态性 引用。在C ++中,传统上,对象被复制,并且(对于 大部分)自动存储持续时间。但副本不起作用 多态对象 - 它们往往被切成碎片。 OO也经常 意味着身份,这反过来意味着你不想复制。所以 解决方案是为对象动态分配和传递 在指针周围。你用它们做什么是设计的一部分:

如果对象在逻辑上是另一个对象的一部分,那么该对象就是 负责其生命周期,以及接收指针的对象 应采取措施确保他们在拥有后不使用它 对象消失了。 (请注意,即使在语言中也是如此 垃圾收集。只要你有一个,物体就不会消失 指向它的指针,但一旦拥有对象无效,就拥有对象 也可能变得无效。事实上垃圾收集器不会 回收内存并不能保证你指向的对象是 可用的。)

如果对象本身是第一类实体,而不是存在 逻辑上是另一个对象的一部分,那么它应该可以照顾 本身。同样,其他可能包含指针的对象必须是 如果它不再存在(或变得无效)通知。使用了 观察者模式是通常的解决方案。回到我开始使用C ++的时候 是一种“关系管理”的时尚,有某种 您注册关系的管理类,以及哪些 据说确保一切顺利。在实践中,他们 要么没有工作,要么没有做简单的观察者 模式,你今天不再听到它们了。

在大多数情况下,您的确切问题是合同的一部分 每个班级都必须为每个职能建立。对于真正的OO 类(实体对象),您可能永远不会删除它们:那是 有生意,不是你的。但也有例外:如果你正在交易 例如,对于事务,删除的对象无法回滚, 所以当一个对象决定自己删除时,它通常会注册 这个事实与事务管理器一样,将把它作为一部分删除 提交,一旦确定,就不需要回滚。如 对于改变对象,这是合同的问题:在很多方面 应用程序,有映射对象,用于映射 对象的某种外部标识符。经常有目标, 能够修改对象。

答案 2 :(得分:0)

根据我的理解和经验,它通常围绕着您尝试做的事情以及使用指针的语言(例如C ++ vs Objective-C)。

通常,在C ++术语中,我发现最好通过引用(甚至std::shared_ptr引用返回对智能指针(例如const)的引用,具体取决于情况),或者只是隐藏类中的指针,如果它需要被外部的东西访问或使用,请使用getter方法复制指针并返回该指针,或返回对指针的引用(授予) ,AFAIK ref-to-ptr只能在C ++中使用)。如果有人不知道你不应该删除一个ref-to-ptr在大多数情况下(当然,如果它的解除分配由内部的类处理),你应该三思而后行他们是否准备好在你的团队中做C ++的事情。

如果类成员可以进行堆栈分配(即,如果它们不占用太多内存),则在内部管理堆分配对象时,对类成员使用公共引用是相当常见的。如果你需要在类之外设置类成员,可以使用一个获取所需值的set方法,而不是直接访问它。