指针与类中的变量

指针与类中的变量

问题描述:

我知道它们之间有什么区别以及它们是如何工作的,但这个问题更多地是关于编码风格。指针与类中的变量

每当我编码时,我做了很多类,它们都有变量,其中一些是指针,一些是正常变量。

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

我不喜欢在中间点:如果会员持续只要类做但后来我的代码变成这样我通常喜欢变量的指针。或与私有变量:

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

我认为,点“消失”在一个长的代码。我发现- >在某些情况下更容易阅读。

我的问题是如果你使用指针,即使变量将在构造函数中创建并在析构函数中被删除?在这种情况下是否有任何风格建议?

P.S.我认为在某些情况下,点看起来更好。

首先暴露成员变量是不好的形式。

其次,你的类可能永远不应该容器指针。包含业务逻辑的类不应该有指针(因为这意味着它们也包含指针管理代码,并且指针管理代码应该留给没有业务逻辑但是专门用于管理指针的类(智能指针和容器)

指针管理类(智能指针/容器)应该设计为管理单个指针。管理多个指针比预期的要困难得多,我还没有找到一种情况,额外的复杂性付出

最后公共成员不应该公开底层实现(你笑即使通过getters/setter也不提供对成员的访问)。这将接口紧密地绑定到实现上。相反,您的公共接口应该提供一组可以在对象上执行的操作。即方法是verbs

在C++中很少见到指针。
它们通常隐藏在其他类中。但是您应该习惯使用->.的混合物,因为这一切都取决于上下文以及您想传达的内容。只要代码干净可读,它就不重要。

个人补遗:

我恨_在那么你的标识符结束它使。 disapear foo_.getName()我认为它看起来好了很多,因为foo.getName()

如果“embedded”结构与“父”结构具有完全相同的生命周期,并且在其他地方没有引用它,我宁愿将它作为成员来使用,而不是使用指针。生成的代码效率稍高一些,因为它可以节省大量对内存分配器的调用,并且避免了大量的指针取消引用。

它也更容易处理,因为指针相关的错误的机会减少。

另一方面,如果嵌入式结构有可能在其他地方被引用,我倾向于使用单独的结构和指针。这样我就不必重构我的代码,如果事实证明嵌入式结构需要从其父节点中取出。

编辑:

我想这意味着我通常与指针替代去:-)

编辑2:

是的,我的回答是假设你真的想(或有)在两者之间进行选择即你编写C风格的代码。适当的面向对象的访问类成员的方法是通过get/set函数。

但是,对于是否包含实际的类实例或指向/的引用,我的评论可能仍然有效。

+0

成员,但是,可能导致大的物体,并导致内存碎片问题出现 – user396672 2011-01-14 12:22:17

理想情况下,你不应该使用:你应该使用getter/setter方法。性能命中率很低(无论如何,编译器可能会优化它)。

第二个考虑因素是使用指针是一个通常很危险的想法,因为在某些时候你可能会搞砸它。

如果这些都不让你感到迷惑,那么我会说剩下的只是个人喜好的问题。

+2

的getter/setter是不好的设计,因为它暴露了实现,因此将你耦合到它(它比耦合更少耦合e变量但仍然有很多不足之处)。 – 2011-01-14 10:19:55

+0

这是什么让人想要的,这不包括在这,例如? http://stackoverflow.com/questions/2747721/getters-and-setters-are-bad-oo-design换句话说,为什么你觉得从来没有一个他们有用的情况? – Kricket 2011-01-14 13:36:34

你不应该让你的选择,因为你会发现“ - >”更容易阅读:) 使用一个成员变量通常是更好,因为你不能用你犯错指针。

这就是说,使用一个成员变量迫使你公开你的实现,因此你必须使用引用。但是,然后你必须初始化然后在你的构造函数,这并不总是可能的...

解决方案是使用std :: auto_ptr或boost :: scoped_ptr类似的智能指针。在那里,您将获得两种解决方案的优势,而且几乎没有什么缺点。

MY2C

编辑:

一些有用的链接:
Article on std::auto_ptr
boost::scoped_ptr
Pimpl : private implementation