c ++ виртуальный класс, подкласс и самоссылка - PullRequest
0 голосов
/ 12 ноября 2009

рассмотрим этот класс:

class baseController {

    /* Action handler array*/

std::unordered_map<unsigned int, baseController*> actionControllers;

protected:

    /**
     *  Initialization. Can be optionally implemented.
     */
    virtual void init() {

    }

    /**
     * This must be implemented by subclasses in order to implement their action
     * management
     */
    virtual void handleAction(ACTION action, baseController *source) = 0;

    /**
     * Adds an action controller for an action. The actions specified in the
     * action array won't be passed to handleAction. If a controller is already
     * present for a certain action, it will be replaced.
     */
    void attachActionController(unsigned int *actionArr, int len,
            baseController *controller);

    /**
     *
     *  checks if any controller is attached to an action
     *
     */
    bool checkIfActionIsHandled(unsigned int action);

    /**
     *
     *  removes actions from the action-controller filter.
     *  returns false if the action was not in the filter.
     *  Controllers are not destoyed.
     */
    bool removeActionFromHandler(unsigned int action);

public:

    baseController();

    void doAction(ACTION action, baseController *source);

};

}

и этот подкласс

class testController : public baseController{

    testController tc;

protected:

    void init(){
        cout << "init of test";
    }



    void handleAction(ACTION action, baseController *source){

        cout << "nothing\n";

    }

};

Компилятор выходит с ошибкой в ​​подклассе члена

testController tc;

.. говоря

error: field ‘tc’ has incomplete type

но если я удаляю это и устанавливаю класс, он работает ... есть ли способ избежать этой ошибки ??? Это выглядит так странно для меня ....

Ответы [ 5 ]

6 голосов
/ 12 ноября 2009
one day someone asked me why a class can't contain an instance of itself and i said;
  one day someone asked me why a class can't contain an instance of itself and i said;
    one day someone asked me why a class can't contain an instance of itself and i said;
      ...

используйте косвенное обращение. (умный) указатель или ссылка на testController, а не на testController.

4 голосов
/ 12 ноября 2009

Ваш код пытается внедрить в себя целый экземпляр testController, что невозможно. Вместо этого вы хотите ссылку:

testController &tc;

или указатель

testController *tc;
0 голосов
/ 17 сентября 2014

(Немного опоздал на вечеринку, но ...)

Может быть, gotch4 хотел напечатать что-то вроде этого?

class testController : public baseController
{
public:
    testController tc();  // <- () makes this a c'tor, not a member variable

    // ( ... snip ... )
};
0 голосов
/ 12 ноября 2009

Вы не можете создать объект класса внутри самого класса. Вероятно, вы намереваетесь сохранить указатель на класс. В этом случае вы должны использовать его как testController* Кстати, почему вы хотите это сделать? Это выглядит немного странно для меня.

0 голосов
/ 12 ноября 2009

Он не скомпилируется, потому что вы объявляете переменную-член 'tc', которая является его экземпляром. Вы не используете tc в подклассе; каково ваше намерение здесь?

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