1

私は C++ でプロジェクトに取り組んでいますが、何が問題なのかわかりません。私は 4 つのクラスを作成しましたが、作業中 (Visual Studio 2010 の下) はすべて正常に見えました。VSはすべての定義を「見た」ので、自動入力と提案を使用できましたが、プロジェクトをコンパイルしようとすると、突然盲目になりました。ヘッダーなどを含めなかったようです(私はそうしました)。奇妙なことに、VS でこれらのクラスを操作しても問題はありません (ヒント、属性とメソッドのリスト、およびそのすべてについて ctrl+space を使用できます) が、コンパイルしようとすると、「ClassName」は型ではありません。以下の問題の簡単なサンプル:

ProButton.cpp:

#include "ProButton.h"

using namespace pGUI;

ProButton::ProButton( ... )
    : ProControl( ... )
{
    ...
}

ProButton.h:

#ifndef __PRO_BUTTON__
#define __PRO_BUTTON__

#include <string>
#include "ProControl.h"

namespace pGUI
{

class ProButton :
    public pGUI::ProControl
{
public:
    //attributes
    ...

public:
    //methods
    ...

};

}


#endif

ただし、コンパイラは次のように述べています: エラー 291 エラー C2653: 'ProButton' : ProButton.cpp のこの行のクラスまたは名前空間ではありません: ProButton::ProButton( ... )

エラー 23 エラー C2039: 'ProControl' : 'pGUI' のメンバーではありません
エラー 24 エラー C2504: 'ProControl' : 基本クラスが未定義です

プロジェクト全体の同様のエラー。何が悪いのかわかりません。私のVSが壊れたように見えます:D

もちろん、それら (...) はそこにコードがあることを意味しますが、今のところそれほど重要ではありません。すべてのソリューションをどこかにアップロードできます。

編集//

名前空間について、すべてのヘッダー ファイル (クラス宣言) は名前空間で次のように定義されます。

namespace pGUI{
   class ProClass
   {
   };
}

これらのクラス (ProClass.cpp 内) のすべての定義は、以下を使用しています。

using namespace pGUI;

最初に。

問題は、ファイルを含める順序にある​​と思います。これがどのように行われることになっているのかわかりません。これまでのところ、次の4つのクラスがあります。

クラス ProGUI:

  • ProContainerへのポインタがあります
  • 内容: ProContainer および ProControl

クラス ProContainer:

  • 次へのポインタがあります: ProGUI および ProControl

クラス ProControl:

  • ProContainerへのポインタがあります
  • ProButtonを含む
  • ProButton の基本クラスです

クラス ProButton:

  • ProControl のサブクラスです。

これらのクラスもirrlichtライブラリを使用していますが、どこに含めるかわかりません。直前にメインファイルに含めました#include "ProGUI.h"。これは、main に含まれる唯一のものでもあります。ProGUI.h .

//編集 2 -> 解決済み

インクルードの問題でした。包含順序を再考し、前方宣言を追加する必要がありました。とにかく、それはすべて奇妙に思え、私を理解するのに多くの時間がかかりました. 助けてくれてありがとう。:)

4

2 に答える 2

2

次のステートメントを使用しているようです。

using namespace pGUI;

クラス宣言の直前:

class ProControl
{

};

次のアプローチを使用する代わりに:

namespace pGUI
{
    class ProControl
    {

    };
}

それusing namespaceが言うように、は名前空間を使用します。namespaceキーワードの後に​​中括弧を使用して、名前空間に何かを明示的に配置する必要があります。

于 2013-01-23T15:32:09.810 に答える
1

using namespace pGUI既存の名前を解決するためにpGUI名前空間を調べる必要があることをコンパイラーに通知します。

名前空間で何かを宣言または実装するには、より具体的にする必要があります。どちらかと:

namespace pGUI
{
    ProButton::ProButton( ... ) : ProControl( ... )
    {
        ...
    }
}

また:

pGUI::ProButton::ProButton( ... ) : ProControl( ... )
{
    ....
}

個人的には、の使用はusing namespace、名前空間のポイントを完全に打ち負かす怠惰なプログラマーハックだと思います。しかし、私は逸脱します。:)

于 2013-01-23T15:35:28.420 に答える