首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++ -什么时候应该在类中使用指针成员

C++ -什么时候应该在类中使用指针成员
EN

Stack Overflow用户
提问于 2009-07-24 03:43:01
回答 4查看 22.9K关注 0票数 27

在学习C++ (和Direct3D,但那是在一段时间以前)的时候,有一件事让我感到困惑,那就是什么时候应该在类中使用指针成员。例如,我可以使用非指针声明:

代码语言:javascript
复制
private:
    SomeClass instance_;

或者我可以使用指针声明

代码语言:javascript
复制
private:
   Someclass * instance_

然后在构造函数中对它使用new()。

我知道如果SomeClass可以派生自另一个类,一个COM对象,或者是一个ABC,那么它就应该是一个指针。有没有其他我应该注意的指南?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-07-24 03:49:08

指针具有以下优点:

a)你可以做一个延迟初始化,这意味着只在第一次实际使用之前初始化/创建对象。

b)设计:如果你对一个外部类类型的成员使用指针,你可以在你的类上面放置一个正向声明,因此不需要在你的头中包括该类型的头-而不是在你的.cpp中包括第三方头-这样做的好处是减少编译时间,并防止由于包括太多其他头而产生的副作用。

代码语言:javascript
复制
class ExtCamera;  // forward declaration to external class type in "ExtCamera.h"

class MyCamera {
public: 
  MyCamera() : m_pCamera(0) { }

  void init(const ExtCamera &cam);

private:
   ExtCamera  *m_pCamera;   // do not use it in inline code inside header!
};

c)指针可以随时删除-这样你就可以对livetime有更多的控制,并且可以重新创建对象-例如在失败的情况下。

票数 25
EN

Stack Overflow用户

发布于 2009-07-24 04:16:01

3DH概述了使用指针的优点:延迟初始化、减少标头依赖以及控制对象的生命周期。

这也是缺点。当您有一个指针数据成员时,您可能必须编写自己的复制构造函数和赋值运算符,以确保正确创建对象的副本。当然,您还必须记住删除析构函数中的对象。此外,如果将指针数据成员添加到现有类中,则必须记得更新复制构造函数和operator=。简而言之,拥有一个指针数据成员对您来说是更多的工作。

另一个缺点是在指针指向的对象的生命周期上的控制的另一面。当对象被销毁时,非指针数据成员将自动销毁,这意味着只要对象存在,您就可以始终确保它们存在。使用指针,你必须检查它是否为nullptr,这也意味着当它没有指向任何东西时,你必须确保将它设置为nullptr。必须处理所有这些可能很容易导致错误。

最后,访问非指针成员可能会更快,因为它们在内存中是连续的。另一方面,访问指向堆上分配的对象的指针数据成员可能会导致缓存未命中,从而使其变得较慢。

你的问题没有唯一的答案。您必须查看您的设计,并决定指针数据成员的优势是否大于额外的麻烦。如果减少编译时间和标头依赖关系很重要,请使用pimpl idiom。如果您的对象在某些情况下不需要您的数据成员,请使用指针,并在需要时分配它。如果这些听起来不像是令人信服的理由,并且您不想做额外的工作,那么就不要使用指针。

如果延迟初始化和减少头依赖关系很重要,那么您应该首先考虑使用智能指针,如std::unique_ptrstd::shared_ptr,而不是原始指针。智能指针使您免于使用上面描述的原始指针带来的许多麻烦。

当然,仍然有一些警告。std::unique_ptr会在自身之后进行清理,因此您不需要添加或修改类的析构函数。但是,它是不可复制的,因此拥有一个唯一的指针作为数据成员会使你的类也不可复制。

使用std::shared_ptr,您不必担心析构函数、复制或赋值。但是,共享指针会导致引用计数的性能损失。

票数 21
EN

Stack Overflow用户

发布于 2009-07-24 03:45:43

如果可以,可以在堆栈上分配它,如果有必要,可以从空闲存储中分配它。这里有一个similar question,你可以在这里找到所有的“为什么”。

当涉及到游戏和其他东西时,你会看到大量指针使用的原因是因为DirectX是一个COM接口,老实说,当时的大多数游戏程序员并不是真正的C++程序员,他们是使用C++类的程序员,在C中,指针的使用是非常普遍的。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1175646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档