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: 'core':宣言されていない識別子私はこれが私の問題を少し明確にすることを願っています。これらの機能は、私の元のコードが長い間ここに投稿する方法であるため、私が何をしたのかを示すために意味をなさないことを忘れてください。

3
コンパイラはコンストラクタについて不平を言っています。コンストラクタがオーバーロードされている場合、Coreクラスの一部としてデフォルトのコンストラクタがありますか?
追加された 著者 Mahesh,
こんにちは、@user。スタックオーバーフローへようこそ。あなたが提示したときにあなたの質問に対する回答を誰かが知っているかもしれませんが、完全最小限のプログラムをペーストすると、 Completeとは、コンパイルエラーを自分自身で見るためにダウンロードしてコンパイルできることを意味します。最小は、それがエラーをまだ示している最小のプログラムであることを意味します。また、このようなプログラムを作成する際には、自分でエラーが発生する可能性があります。詳細については、 sscce.org を参照してください。
追加された 著者 Robᵩ,

3 答え

" externコアコア"行の前に window.h ヘッダーを含めています。 window.h ヘッダの class Window の直前にその行を追加してみてください:

window.h

#ifndef WINDOW_H__
#define WINDOW_H__

extern Core core;

class Window
{...}

Coreをグローバル変数として使用する代わりに、 Core クラスの静的メンバーとして core を移動できます。これは、シングルトンパターンと呼ばれています。

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();
}

window.h

class Window
{
  void someFunction();
};

window.cpp

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

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

  core->doSomething();
}
8
追加された
@ vz0:未定義のタイプ 'Core :: Core' エラーは、ここに掲載されているものでは修正されません。
追加された 著者 Mooing Duck,
さて、彼はエラーメッセージを明確にしました。そして今、あなたが取り組んできた(現実の)問題を見ています。私は愚かな気がしません。
追加された 著者 Mooing Duck,
とにかく、ほとんどのリンカーがインライン展開できます。それを心配しないでください。
追加された 著者 Mooing Duck,
回答が更新されました。
追加された 著者 vz0,
@DipankarSahaあなたはコアコア:: coreInstanceを見逃しています。 .cppファイル
追加された 著者 vz0,
こんにちは、答えに感謝します。私の実装をccpファイルに入れたら、関数がインラインであり、別のcppファイルで関数をインライン化できないという問題があります。
追加された 著者 roohan,
ちょっとvz0 ... Okは、関数をwindow.cppファイルに移動するだけではそれだけでは解決できませんでした。あなたの更新を読んだ後、私はあなたがwindow.cppファイルにコアヘッダーを含めたことを知りました。どうもありがとうございました!唯一の問題は、私はこの機能をインラインで使うことができないということです。
追加された 著者 roohan,
私は Core :: coreInstance への未定義参照を取得しています。理由は何ですか?
追加された 著者 Dipankar Saha,

コアのデフォルトのコンストラクタを定義するのを忘れていたか、またはコアがデフォルトのコンストラクタを持たないベースまたはメンバーを持っているため、コアを簡単にデフォルトで構築することはできません。

コアに追加するには:

class Core {
    Window window;

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

ウィンドウに、以下を追加してください:

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

いずれかがコンパイルに失敗した場合は、もう少し問題を特定します

編集:

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

0
追加された
C2027:定義されていないタイプの 'Core :: Core'(大文字)を実際のエラーメッセージの使用ですか?またはそれは C2027:未定義の型 'Core :: core' (小文字)の使用ですか?または C2027:未定義のタイプ 'Core' (noscope)を使用していますか?それ以来、私はあなたが書いたものを最初に引き受けましたが、コンストラクタを定義することでそれを修正する必要がありました。
追加された 著者 Mooing Duck,
msdn.microsoft.com/en-us/ /library/6c2dk0ah(v=vs.80).aspx の場合、エラーの引用符にあるものは型にする必要があります。あなたは関数をリストしました。それは本当にエラーメッセージですか?
追加された 著者 Mooing Duck,
こんにちは、私はまだデフォルトのコンストラクタを持っていません。しかし、それらを追加することは私の問題を解決しませんでした。私はまだコアがWindowクラスで宣言されていないというエラーを受け取ります。
追加された 著者 roohan,
こんにちは、私は私の問題を明確にするために私の最初の投稿を編集し、私はそれが役立つことを願っています。
追加された 著者 roohan,
関数の定義をcppファイルに移動すると、 "Core"はまだ分かりません。私がポインタとしてCoreを初期化しようとすると、コンパイラーはウィンドウヘッダーファイルのCore Datatypeを知りません。
追加された 著者 roohan,

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

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