我知道它们有什么区别以及它们是如何工作的,但这个问题更多的是关于编码风格。
每当我编写代码时,我会编写很多类,它们都有变量,其中一些是指针,一些是正常变量。我通常更喜欢变量指针,如果成员持续的时间和类一样长,那么我的代码就像这样:
engine->camera.somevar->x;
// vs
engine->camera->somevar->x;
我不喜欢中间的圆点。或者使用私有变量:
foo_.getName();
// vs
foo_->gatName();
我认为点在长代码中“消失”。在某些情况下,我发现 - > 更容易阅读。
我的问题是如果你使用指针,即使变量将在构造函数中创建并在析构函数中删除?在这种情况下有任何风格建议吗?
P.S。我认为在某些情况下,点看起来更好。
答案 0 :(得分:6)
首先,暴露成员变量是不好的形式。
第二,你的类应该永远不会是容器指针。
轻微的证据:包含业务逻辑的类永远不应该有指针(因为这意味着它们还包含指针管理代码和指针管理代码应留给没有业务逻辑但专门用于管理指针的类的类(智能指针和容器)。
指针管理类(智能指针/容器)应设计为管理单个指针。管理不止一个比你想象的要困难得多,我还没有找到一个额外的复杂性得到回报的情况。
最后,公共成员不应公开底层实现(即使通过getter / setter也不应提供成员访问权限)。这将接口与实现紧密绑定。相反,您的公共接口应该提供一组可以在对象上执行的操作。方法是verbs
。
在C ++中很少见到指针
它们通常隐藏在其他类中。但是你应该习惯使用->
和.
的混合,因为这完全取决于背景和你想传达的内容。只要代码干净且可读,就没那么重要了。
个人附录:
我讨厌_在你的标识符的末尾它做了。 disapear foo_.getName()
我认为它看起来会更好foo.getName()
答案 1 :(得分:1)
如果“embedded”结构与“父”结构具有完全相同的生命周期,并且未在其他任何地方引用它,我更喜欢将其作为成员,而不是使用指针。生成的代码效率稍高,因为它节省了对内存分配器的大量调用,并且避免了许多指针解引用。
它也更容易处理,因为指针相关错误的可能性降低了。
另一方面,如果嵌入式结构可能被引用到其他地方,我更倾向于使用单独的结构和指针。这样,如果事实证明嵌入式结构需要从其父级中提取出来,我就不必重构我的代码。
编辑:
我想这意味着我通常选择指针: - )
编辑2:
是的,我的回答是假设你真的想要(或有)在两者之间做出选择,即你编写C风格的代码。正确的面向对象访问类成员的方法是通过get / set函数。
关于是否包含实际类实例或指针/引用的注释可能仍然有效。
答案 2 :(得分:1)
你不应该做出选择,因为你找到' - >'更容易阅读:) 使用成员变量通常更好,因为你不能用指针犯错误。
这就是说,使用成员变量强制您公开您的实现,因此您必须使用引用。但是你必须在你的构造函数中初始化,这并不总是可能的......
解决方案是使用std :: auto_ptr或boost :: scoped_ptr类似的智能指针。在那里你将获得两种解决方案的优势,但缺点很少。
my2c
编辑:
一些有用的链接:
Article on std::auto_ptr
boost::scoped_ptr
Pimpl : private implementation
答案 3 :(得分:0)
理想情况下,您不应该使用任何一种:您应该使用getter / setter方法。性能损失很小(无论如何,编译器可能会优化它)。
第二个考虑因素是使用指针通常是一个危险的想法,因为在某些时候你可能会搞砸它。
如果这些都没有让你感到烦恼,那么我会说剩下的只是个人偏好。