我想知道这两种设计模式中哪一种在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指出并使成员函数私有以避免封装问题,正如其他人指出的那样。这个问题是一个简化版本。我希望我现在能做到。
答案 0 :(得分:1)
您很少有一个方法可以创建除构造函数之外的成员变量。否则你会遇到一系列问题。但你的帖子不是关于那个。
除了你的两个代码片段可能都有一个有效的应用程序,至少基于它背后的想法:在第一个代码示例中,你将创建一些东西,而公共接口允许操作这个内部状态对象。对于封装来说,这可能是非常常见和正常的。 doSomeThing
(另外,我建议将其命名为doSomething
)可能是计算某些数字的方法,这些数字可能在初始化时进行,有时也可能在稍后进行,这可以解释该方法是一部分的事实公共接口。
在您的第二个代码段中,var
似乎是一个临时变量,因为您可以立即使用doSomeThing
和参数对其进行操作。将doSomething
作为该类的公共成员函数是不常见的。在哪种情况下,类能够创建并立即更改对象并为局外人提供相同的更改操作?非常罕见,情况确实如此。
通过使用一个非属性的变量,你基本上会说:这个变量不是类的状态的一部分,它不会在我们调用createSomeType
的执行之外持续存在,至少不直接在这个类实例中。
另请注意:没有删除的新内容会导致C ++中的内存泄漏。相反,你应该使用像unique_ptr
这样的智能指针,以便安全地管理你的记忆。