C / C ++ - наследование вложенного класса от включающего класса - PullRequest
1 голос
/ 30 декабря 2011

Я хотел бы использовать вложенные классы как часть приложения, которое я создаю.Первый фрагмент кода, который у меня есть (заголовочный файл, в который я включил код для этого вопроса), выглядит следующим образом:

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

};

Теперь я хочу создать экземпляр класса WindowWithCropMaxSquare в MAIN и выполнить mouseHandler function.

В MAIN у меня есть

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

Однако это вызывает проблему на этапе связывания.Я получил следующую ошибку:

Ошибка 1 ошибка LNK2019: неразрешенный внешний символ "public: __thiscall Window :: WindowWithCropMaxSquare :: WindowWithCropMaxSquare (char *)" (?? 0WindowWithCropMaxSquare @ Window @@ QAE @ PAD@Z) упоминается в функции _main c: \ Users \ Nicolas \ documents \ visual studio 2010 \ Projects \ AFRTProject \ AFRTProject \ AFRTProject.obj

Итак, кто-нибудь может сообщить мне, как решить эту проблемупроблема?

1 Ответ

3 голосов
/ 08 января 2012

Вам нужны две вещи: тело для каждого конструктора и правильная константность.

WindowWithCropMaxSquare( char* name );

- это просто объявление без какого-либо определения (тела). Пустое тело конструктора, как вы подразумеваете в своем комментарии, будет

WindowWithCropMaxSquare( char* name ) {}

Также я очень подозреваю, что

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

требуется конструктор, который принимает const char*, поскольку вы задаете ему константу (значение):

WindowWithCropMaxSquare( const char* name ) {}

или

WindowWithCropMaxSquare( const string& name ) {}

Компилятор не будет передавать константу в качестве аргумента функции, которая принимает неконстантный тип, поскольку такая функция указывает вам, что она может изменить данный аргумент, явно не допустимый для константы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...