2011-10-27 48 views
3

編集:OKここに示す小さなテストプログラムを作成しました。ここにソースコードがあります。C++ Externクラス宣言

main.cppに:

#include "core.h" 

Core core; 

int main() 
{ 
    core.coreFunction(); 
} 

core.h:

#ifndef CORE_H__ 
#define CORE_H__ 

#include "definitions.h" 
#include "window.h" 

class Core 
{ 
public: 
    Window window; 
    void coreFunction() 
    { 
    window.windowFunction(); 
    } 
}; 
extern Core core; 

#endif 

definitions.h

#ifndef DEFINITIONS_H__ 
#define DEFINITIONS_H__ 

class Core; 
class Window; 

#endif 

window.h

#ifndef WINDOW_H__ 
#define WINDOW_H__ 

class Window 
{ 
public: 

    void windowFunction() 
    { 
    core.coreFunction(); 
    } 
}; 

#endif 

このテストプログラムでは、次のエラーが発生します。window.h(10):エラーC2065: 'コア':宣言されていない識別子。私はこれが私の問題を少し明確にすることを願っています。これらの機能は、私の元のコードが長い間ここに投稿する方法であるため、私が何をしたのかを示すために意味をなさないことを忘れてください。

+1

コンストラクタはコンパイラについて不平を言っています。コンストラクタがオーバーロードされている場合、Coreクラスの一部としてデフォルトのコンストラクタがありますか? – Mahesh

+5

こんにちは、@user。スタックオーバーフローへようこそ。あなたが提示したときにあなたの質問に対する答えを誰かが知っているかもしれませんが、** complete **、** minimal **プログラムをペーストすると、オッズが改善されます。 Completeとは、コンパイルエラーを自分自身で見るためにダウンロードしてコンパイルできることを意味します。最小は、それがエラーをまだ示している最小のプログラムであることを意味します。また、このようなプログラムを作成する際には、自分でエラーが発生する可能性があります。詳細はhttp://sscce.orgを参照してください。 –

答えて

7

extern Core core;」行の前にwindow.hヘッダーが含まれています。ただwindow.hヘッダ上のclass Window行の前にその行を追加してみてください:

#ifndef WINDOW_H__ 
#define WINDOW_H__ 

extern Core core; 

class Window 
{...} 

代わりにグローバル変数としてのコアを使用しての

window.h、あなたはCoreの静的メンバーとしてcoreを移動することができますクラス。これはSingleton patternと呼ばれます。

main.cppに

#include "core.h" 

int main() 
{ 
    Core* core = Core::getInstance(); 

    core->coreFunction(); 
} 

core.h

#include "window.h" 

class Core 
{ 
public: 
    static Core* getInstance() { return &coreInstance; } 
    void someFunction(); 

private: 
    static Core coreInstance; 
    Window window; 
}; 

core.cpp

#include "core.h" 

Core Core::coreInstance; 

void Core::someFunction() 
{ 
    window.doSomething(); 
} 

class Window 
{ 
    void someFunction(); 
}; 

window.h window.cpp

#include "window.h" 
#include "core.h" 

void Window::someFunction() 
{ 
    Core* core = Core::getInstance(); 

    core->doSomething(); 
} 
+0

こんにちは、答えに感謝します。私の実装をccpファイルに入れたら、関数がインラインであり、別のcppファイルで関数をインライン化できないという問題があります。 – roohan

+0

@ vz0: '未定義のタイプ 'Core :: Core''エラーは私がここに投稿したもので修正されません。 –

+0

さて、彼はエラーメッセージを明らかにしました。そして、私はあなたが取り組んだ(現実の)問題を見ています。私は愚かな気がしません。 –

0

あなたの問題が見つかりました。定義ヘッダーファイルでは、 "コア"クラスが "コア"として宣言されています。帽子は大きな違いがあることを忘れないでください。

+0

申し訳ありませんが、私の間違いは私の投稿を編集しました。大文字と小文字の区別は問題ではありません:) – roohan

0

は、あなたがコアのデフォルトコンストラクタを定義するのを忘れたか、コアは自明により行いベースまたはメンバーを有すること(建設デフォルトすることはできませんデフォルトコンストラクタを持たない。コアに

、追加:

class Core { 
    Window window; 

    Core() {} //add this line 
    void someFunction() 
    { 
     window.doSomething(); 
    } 
} 

をウィンドウに追加:

class Window 
{ 
    Window() {} //add this line 
    void someFunction() 
    { 
     core.doSomething(); 
    } 
} 

のコンパイルに失敗したいずれかの場合は、もう少し

EDITを問題を釘付けにしていますよ:

エラーメッセージが明確になったので、エラーがすぐに表示されます。 Window.hは、Core coreを定義する必要があり、Core.hは、Windowを定義する必要があります。解決策は、外出先から提案されたvz0として行うことです。 Window::someFunctionの定義をwindow.cppに移動してください(そして、私はvz0に謝罪する必要があると感じています)。

+0

こんにちは、私はまだデフォルトコンストラクタを持っていませんでした。しかし、それらを追加することは私の問題を解決しませんでした。私はまだコアがWindowクラスで宣言されていないというエラーを受け取ります。 – roohan

+0

'C2027:定義されていないタイプの 'Core :: Core''(大文字)の実際のエラーメッセージを使用していますか?それとも 'C2027:定義されていない型の 'Core :: core''(小文字)の使用ですか?または 'C2027:定義されていない型 'Core''(noscope)の使用?それ以来、私はあなたが書いたものを最初に引き受けましたが、コンストラクタを定義することでそれを修正する必要がありました。 –

+0

http://msdn.microsoft.com/en-us/library/6c2dk0ah(v=vs.80).aspxによると、エラーの引用符にあるものは型にする必要があります。あなたは関数をリストしました。それは本当にエラーメッセージですか? –

関連する問題