c++ - 指向成员变量的指针与通过指针传递

标签 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 指出的那样,并将成员函数设为私有(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/

相关文章:

c++ - 无法在C++中包含 header

c++ - Linux UDP 服务器 - 目标 IP 错误

c++ - 当我运行 C++ 代码时,总是出现 Visual Studio 错误 C2664

c++ - 如何在没有 libiconv 符号名称的情况下在 OSX 上构建 iconv 的静态库?

c++ - 链接器错误 : undefined reference c++

c++ - 测试C++代码的性能

c++ - 我可以使用互锁操作来更新多个值以避免锁定临界区/互斥锁吗?

c++ - main() 函数中的 try\catch block 没有括号

c++ - 高效实现二分查找

c++ - cpp std::list 使用步进添加新元素