0

ここに私のヘッダーコードがあります:

#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;
    }
}

私の2つのエラーは次のとおりです。

不完全な型 'struct CLandTypes::Pimple' の無効な使用 'struct CLandTypes::Pimple' の
前方宣言

4

2 に答える 2

1

この行を移動します:

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

のクラス定義の後になりますCLandTypes::Pimple

new何も知らないクラスのインスタンスを作成するために使用する試みに反対しています。

これを行う場合は、コンストラクターの定義でdがnullptr(別名)であるかどうかを確認するコードを削除します。このコードにより、メモリリークが発生する可能性があります。また、呼び出し後に再度チェックしてからスローすることは、割り当ての失敗時にスローするように定義されているため、まったく不要です。!dCLandTypes::CLandTypesnew::std::bad_allocnew::std::bad_alloc

メモリリークが発生する可能性があるのは、初期化する静的初期化子が実行される前にコンストラクターが実行される場合ですCLandTypes::dCLandTypesそして、それは、のコンストラクターが別の場所の静的初期化子で使用されている場合にのみ発生する可能性があります。コンストラクターがに値を与えたd後、の静的初期化子dが後で実行され、その値が上書きされるため、メモリリークが発生します。

于 2011-04-25T11:18:06.140 に答える
0

「class Pimple」を非公開ではなく公開として宣言してみて、それが役立つかどうか教えてください。インスタンス化する前に、必ずクラスを定義してください。

于 2011-04-25T10:29:34.127 に答える