这是我的标头代码:

#ifndef CLANDTYPES_H
#define CLANDTYPES_H

class CLandTypes
{
public:
    CLandTypes();
    ~CLandTypes();
private:
    class Pimple;
    static Pimple * d;
};

#endif // CLANDTYPES_H


因为它应该是一个静态类,所以我尝试在cpp文件中进行编码:

#include "clandtypes.h"

CLandTypes::Pimple * CLandTypes::d = new CLandTypes::Pimple();
...


但是出了点问题!

----------编辑----------

这是我的扩展C ++代码:

#include "clandtypes.h"

#include "qvector.h"
#include "qpair.h"

CLandTypes::Pimple * CLandTypes::d = new CLandTypes::Pimple();

class CLandTypes::Pimple
{
public:
    Pimple();
    ~Pimple();

    QVector > LandTypes;
};

CLandTypes::Pimple::Pimple()
    : LandTypes(NULL)
{
    LandTypes.push_back(qMakePair((unsigned int) 0, (QString)"undefined"));
    LandTypes.push_back(qMakePair((unsigned int) 1, (QString)"rocky"));
}

CLandTypes::Pimple::~Pimple(){}

CLandTypes::CLandTypes()
{
    if (!d)
    {
       d = new Pimple();
       if (!d)
       {
           throw std::bad_alloc();
       }
    }
}

CLandTypes::~CLandTypes()
{
    if(d)
    {
        delete d;
        d = NULL;
    }
}


我的两个错误是:

无效使用不完整类型'struct CLandTypes :: Pimple'
前向声明'struct CLandTypes :: Pimple'

最佳答案

移动这一行:

CLandTypes::Pimple * CLandTypes::d = new CLandTypes::Pimple();


CLandTypes::Pimple的类定义之后。

它反对您尝试使用new创建一无所知的类的实例。

如果这样做,请删除在nullptr构造函数的定义中检查d是否为!d(又名CLandTypes::CLandTypes)的代码。此代码可能会导致内存泄漏。同样,在调用new之后再进行检查,然后再抛出::std::bad_alloc是完全不必要的,因为定义了new会在分配失败时抛出::std::bad_alloc

发生内存泄漏的方式是,如果构造函数在初始化CLandTypes::d的静态初始化程序运行之前运行。只有在其他地方的静态初始化程序中使用CLandTypes的构造函数时,这种情况才会发生。将会发生的事情是,构造函数将为d提供一个值,然后d的静态初始化程序将在稍后运行并覆盖该值,从而导致内存泄漏。

关于c++ - 如何初始化静态类的pimple习语的d(指针)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5776961/

10-09 16:45