成员变量vs指针传递的指针

时间:2016-03-11 14:20:01

标签: c++

我想知道这两种设计模式中哪一种在C ++社区中更常见,如果怀疑哪一种更喜欢另一种。如果它取决于用例,会有什么决定?

Class A
{
public:
     A(){createSomeType();}
private:
    SomeType* m_var;
    void createSomeType(){m_var = new SomeType; doSomeThing();}
    void doSomeThing(){m_var->doSomeThing();}
};


Class A
{
public:
    A(){createSomeType();}
private:
    void createSomeType(){SomeType* var = new SomeType; doSomeThing(var);}
    void doSomeThing(SomeType* var){var->doSomeThing();}
};
编辑:编辑避免UB,因为tobi303指出并使成员函数私有以避免封装问题,正如其他人指出的那样。这个问题是一个简化版本。我希望我现在能做到。

1 个答案:

答案 0 :(得分:1)

您很少有一个方法可以创建除构造函数之外的成员变量。否则你会遇到一系列问题。但你的帖子不是关于那个。

除了你的两个代码片段可能都有一个有效的应用程序,至少基于它背后的想法:在第一个代码示例中,你将创建一些东西,而公共接口允许操作这个内部状态对象。对于封装来说,这可能是非常常见和正常的。 doSomeThing(另外,我建议将其命名为doSomething)可能是计算某些数字的方法,这些数字可能在初始化时进行,有时也可能在稍后进行,这可以解释该方法是一部分的事实公共接口。

在您的第二个代码段中,var似乎是一个临时变量,因为您可以立即使用doSomeThing和参数对其进行操作。将doSomething作为该类的公共成员函数是不常见的。在哪种情况下,类能够创建并立即更改对象并为局外人提供相同的更改操作?非常罕见,情况确实如此。

通过使用一个非属性的变量,你基本上会说:这个变量不是类的状态的一部分,它不会在我们调用createSomeType的执行之外持续存在,至少不直接在这个类实例中。

另请注意:没有删除的新内容会导致C ++中的内存泄漏。相反,你应该使用像unique_ptr这样的智能指针,以便安全地管理你的记忆。