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