c++ - 如何成功创建一个创建对象并返回指向该对象的指针的函数?

标签 c++ oop pointers reference

使用 Direct2d 时存在这个函数:

HRESULT WINAPI D2D1CreateFactory(
  _In_      D2D1_FACTORY_TYPE factoryType,
  _In_      REFIID riid,
  _In_opt_  const D2D1_FACTORY_OPTIONS *pFactoryOptions,
  _Out_     void **ppIFactory
);

当上述方法返回时,ppIFactory 包含指向新工厂的指针的地址,因此可以使用该工厂。

我想做类似的事情,所以我在 MessageLog.h 中这样做了:

void CreateMessageLog(MessageLog**);

class MessageLog{
public:
    void PutToLog(WCHAR[]);

    WCHAR* GetLog();
    int GetLogLenght();
    int GetnLogLines();

private:
    WCHAR logHistory[MaxLogSize];
    int nLogLines;
};

并将其放入 MessageLog.cpp 中:

void CreateMessageLog(MessageLog** ppMessageLog)
{
    MessageLog mLog;
    MessageLog* pmLog=&mLog;
    ppMessageLog=&pmLog;
}

完成后,我遇到了一些问题。首先,一旦CreateMessageLog函数结束,创建的MessageLog对象就会超出作用域,指针会变成NULL对吧?这个问题的解决方案是什么?

顺便说一句,我想我的 CreateMessageLog 函数不会执行我期望的操作。这个问题的解决方案是什么?谢谢。

最佳答案

使用动态分配:

MessageLog* CreateMessageLog()
{
    return new MessageLog;
}

和外部记得delete函数内部new创建的指针。 您将能够随时访问指针指向的内存。完成后,您必须通过调用 delete a 手动释放内存:

例子:

MessageLog* a = createMessageLog();
// use `a` the way you want
// when done:
delete a;

如果 MessageLog 对象不是很大,您也可以创建一个拷贝。即使效率较低,您也不必自己管理内存:

MessageLog CreateMessageLog()
{
    MessageLog a;
    return a;
}

PS:确保复制构造函数可用。

关于c++ - 如何成功创建一个创建对象并返回指向该对象的指针的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15451340/

相关文章:

PHP 面向对象的数据库访问

java - OOM中如何设计这个案例

php - 当我试图访问静态属性时,如何确保构造函数被执行?

javascript - 如何在 JavaScript 中创建指针

c++ - 为接口(interface)实现通用函数

c++ - 什么时候需要显式调用析构函数?

c++ - 将 Lua 与 Visual Studio 2010 链接起来

c++ - 为 Qt 项目创建 .deb 包

无法将指向结构的指针中的 a::c * 转换为 c *

使用 malloc 和指针在 C 中创建 2 个随机矩阵