在类中,指针和变量的区别

9 浏览
0 Comments

在类中,指针和变量的区别

我知道它们的区别以及它们是如何工作的,但这个问题更多关于编码风格。\n每当我编写代码时,我会创建许多类,它们都有变量,其中一些是指针,一些是普通的变量。如果成员变量的生命周期与类一样长,我通常更喜欢使用变量而不是指针,但这样我的代码就变成了这样:\n

engine->camera.somevar->x;
// vs
engine->camera->somevar->x;

\n我不喜欢中间的那个点。或者对于私有变量:\n

foo_.getName();
// vs
foo_->gatName();

\n我觉得点在一段长代码中会“消失”。在某些情况下,我发现->更容易阅读。\n我的问题是,即使变量将在构造函数中创建并在析构函数中删除,你是否仍然使用指针?在这种情况下有什么样的风格建议吗?\n附言:我确实认为在某些情况下点看起来更好。

0
0 Comments

在类中使用指针或变量时,可能会出现选择的困扰。在选择时,不应仅仅因为'->'更容易阅读而做出决定。使用成员变量通常更好,因为你不会犯指针错误。然而,使用成员变量会强制你暴露实现细节,因此你必须使用引用。但是,在构造函数中初始化引用并不总是可能的。解决方法是使用std::auto_ptr或boost::scoped_ptr等智能指针。这样可以获得两种解决方案的优点,几乎没有缺点。

一些有用的链接:

- [std::auto_ptr文章](http://www.gotw.ca/publications/using_auto_ptr_effectively.htm)

- [boost::scoped_ptr](http://www.boost.org/doc/libs/1_44_0/libs/smart_ptr/scoped_ptr.htm)

- [Pimpl : private implementation](http://c2.com/cgi/wiki?PimplIdiom)

0
0 Comments

指针与变量在类中的选择问题主要是出于效率和代码处理方面的考虑。如果嵌入的结构体与父结构体具有完全相同的生命周期,并且没有在其他地方引用,那么我更倾向于将其作为成员变量而不是使用指针。这样产生的代码稍微更高效一些,因为它节省了许多调用内存分配器的次数,并且避免了许多指针解引用的操作。而且,这样处理起来更容易,减少了出现指针相关错误的机会。

然而,如果有一丝可能性嵌入的结构体可能在其他地方被引用,我更倾向于使用单独的结构体和指针。这样,如果嵌入的结构体需要从其父结构体中分离出来,我就不需要重构我的代码。

另外,如果选择使用指针方式,可能需要注意内存碎片问题。成员变量可能导致大型对象出现内存碎片问题。

需要注意的是,以上回答假设你确实想要(或者必须)在指针和变量之间做出选择,即你编写的是类似C风格的代码。如果使用真正的面向对象的方式访问类成员,应该通过get/set函数进行。

总之,选择指针还是变量主要取决于嵌入结构体的生命周期和是否会在其他地方引用,以及代码的效率和处理复杂性的考虑。

0
0 Comments

指针与变量在类中的比较

在编写类时,有时会遇到使用指针还是变量的问题。下面我们来分析一下这个问题的出现原因以及解决方法。

首先,将成员变量暴露出来是不好的做法。

其次,类应该尽量不包含指针。稍微补充一下:包含业务逻辑的类不应该包含指针,因为这意味着它们还包含指针管理代码,而指针管理代码应该留给专门用于管理指针的类(智能指针和容器)。

指针管理类(智能指针/容器)应该设计成管理单个指针。管理多个指针比你想象的要困难得多,而且我还没有找到额外复杂性有所回报的情况。

最后,公共成员不应暴露底层实现(即使通过getter/setter提供访问权限也不行)。这样会将接口与实现过于紧密地绑定在一起。相反,公共接口应提供一组可以对对象执行的操作,即方法就是动词。

在C++中很少看到指针。它们通常隐藏在其他类中。但你应该习惯使用->.的混合,因为这取决于上下文和你想传达的意思。只要代码清晰易读,不太重要。

个人附言:

我讨厌在标识符末尾加下划线,这会使.消失foo_.getName(),我认为将其写成foo.getName()会好看得多。

好了,那么成员变量与智能指针(在实现代码中)有什么关系呢?

关于这个问题,智能指针只是像其他任何对象一样。它的工作是管理单个指针。

嗯,有些类有公共变量,我不明白为什么要将它们设为私有。只有在类的工作可能被无效使用损坏时,我才会将变量设为私有。如果它们只是为了使程序结构更好看 - 为什么不呢。例如,引擎的示例。当我编写任何游戏时(有时候我会制作一些烂游戏,这很有趣),我会创建一个外部指针"engine",因为它被许多其他对象使用。而且该引擎通常在公共范围内包含像相机这样的内容。我这么做是因为其他对象需要访问相机类,而且它不会破坏引擎。

是的,有一些情况下,成员变量可以合法地设为公共的(比如结构体)。但是,通常情况下,成员变量不应通过公共方式暴露,因为这会破坏封装。这是面向对象编程的一个重要原则。现在将成员变量设为公共不会破坏代码,只是会使长期来看更新或维护代码变得困难。

0