2011-12-30 34 views
1

私が構築しているアプリケーションの一部としてネストされたクラスを使用したいと思います。私は(私はこの質問のためにいくつかのコードを含まれるヘッダファイルを、)持っているコードの最初の部分は以下の通りです:C/C++ - 入れ子クラスEnclosingクラスを継承しています

class Window { 

public: 
    indev::Thunk32<Window, void (int, int, int, int, void*)> simpleCallbackThunk; 
    Window() { 
     simpleCallbackThunk.initializeThunk(this, &Window::mouseHandler); // May throw std::exception 
    } 
    ~Window(); 

    class WindowWithCropMaxSquare; 
    class WindowWithCropSelection; 
    class WindowWithoutCrop; 

    virtual void mouseHandler(int event, int x, int y, int flags, void *param) { 
    printf("Father"); 
    } 

private: 
    void assignMouseHandler(CvMouseCallback mouseHandler);  

}; 

class Window::WindowWithCropMaxSquare : public Window { 

public: 
    WindowWithCropMaxSquare(char* name); 
    virtual void mouseHandler(int event, int x, int y, int flags, void *param) { 
     printf("WWCMS"); 
    } 

}; 

class Window::WindowWithCropSelection : public Window { 

public: 
    WindowWithCropSelection(char* name); 
    virtual void mouseHandler(int event, int x, int y, int flags, void *param) { 
     printf("WWCS"); 
    } 

}; 

class Window::WindowWithoutCrop : public Window { 

public: 
    WindowWithoutCrop(char* name); 
    virtual void mouseHandler(int event, int x, int y, int flags, void *param) { 
     printf("WWOC"); 
    } 

}; 

は今、私はMAINでWindowWithCropMaxSquareクラスをインスタンス化し、mouseHandler機能を実行したいです。私は

Window::WindowWithCropMaxSquare *win = new Window::WindowWithCropMaxSquare("oopa"); 
win->mouseHandler(1,1,1,1,0); 

を持ってMAINで

しかし、これはリンクの段階で問題が発生します。次のエラーが発生しました:

Error 1 error LNK2019: unresolved external symbol "public: __thiscall Window::WindowWithCropMaxSquare::WindowWithCropMaxSquare(char *)" ([email protected]@@[email protected]@Z) referenced in function _main c:\Users\Nicolas\documents\visual studio 2010\Projects\AFRTProject\AFRTProject\AFRTProject.obj

この問題を解決する方法を教えてもらえますか?

+0

どこにでもコンストラクタを実装していますか? –

+0

いいえ、私はまだそれ以外のものは実装していません。/ –

+2

コンストラクタは実装する必要がありますが、空にすることができます(つまり '{}')。 –

答えて

3

各コンストラクタの本体と正しいconst'nessの2つが必要です。

WindowWithCropMaxSquare(char* name); 

は単なる宣言(本体)のない宣言です。空のコンストラクタ本体、あなたがあなたのコメントに暗示するように、また

WindowWithCropMaxSquare(char* name) {} 

だろうあなたはそれを一定の(右辺値)を与えているので、

Window::WindowWithCropMaxSquare *win = new Window::WindowWithCropMaxSquare("oopa"); 

const char*を取るコンストラクタが必要であることを私は非常に疑わしいです:

WindowWithCropMaxSquare(const char* name) {} 

または

WindowWithCropMaxSquare(const string& name) {} 

コンパイラは、非定数を取る関数に定数を与えません。そのような関数は、与えられた引数を変更する可能性があり、定数に対しては明白ではないことを示しているからです。

関連する問題