Перекрестная ссылка на братьев и сестер с общей поверхности - PullRequest
0 голосов
/ 28 марта 2020

У меня есть что-то вроде этого:

class X
{
    method(){...};
    void f()=0;
};

class my_X;
class my_Y;

class my_X: public X
{
    public:
        his_Y* opp;
        void f()={...};
};

class his_X: public X
{
    public:
        my_X* opp;
        void f()={...};
};

Теперь, когда я хочу получить прибыль от полиморфизма и использовать мой член opp, в то время как при вызове X::method() g ++ говорится, что opp не было объявлено. Поскольку X является абстрактным, я думал, что компилятор поймет, что метод может быть вызван только из my_X или his_X, в котором объявлено opp.

Один найденный трюк - добавить член X* opp моего класса X, который впоследствии будет скрыт моими определениями подклассов opp.

Это правильное решение? Если нет, есть ли решение? Или эта проблема связана с плохим дизайном класса?

1 Ответ

0 голосов
/ 28 марта 2020

Одно из возможных решений

class X
{
    method(){... getOpp(); ...};
    virtual void f()=0;
    virtual X* getOpp() = 0;
};

class my_X;
class my_Y;

class my_X: public X
{
    public:
        his_Y* opp;
        void f()={...};
        X* getOpp() override { return opp; }
};

class his_X: public X
{
    public:
        my_X* opp;
        void f()={...};
        X* getOpp() override { return opp; }
};

Поскольку X является абстрактным, я думал, что компилятор поймет, что метод может быть вызван только из my_X или his_X, в которых объявлен opp.

Нет, этого не понять. При компиляции класса X он ничего не знает о производных классах.

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