Производные члены класса недоступны из функции, которая принимает указатель на базовый класс в качестве параметра? - PullRequest
0 голосов
/ 20 апреля 2020

Я реализую проверку типов и написал функцию, которая использует два указателя для объектов базового класса и проверяет, представляют ли объекты один и тот же тип.

Это определение базового класса:

class Type {
public:
    virtual int get_type(void) { return 1; };
    string name;
    Type(){};
    Type(string n)
    {
        name = n;
    }
};

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

class Array : public Type {
public:
    Type *type;
    int depth;
    virtual int get_type(void) { return 3; };
    Array(Type *t, int d) : Type("array"){
        type = t;
        depth = d;
    }
};

Я написал следующую функцию:

bool check_type(Type *t1, Type *t2)
{
    int a1 = t1->get_type(), a2 = t2->get_type();
    if (a1 != a2)
        return false;
    if(a1 == 1 )
    {
        if(t1->name == t2->name)
            return true;
        return false;
    }
    else if(a1 == 3)
    {
        if(t1->depth == t2->depth && check_type(t1->type, t2->type))
            return true;
        return false;
    }
}

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

При доступе к производным членам класса глубина и тип из функции я получаю следующую ошибку:

./src/parser.y:722:29: error: ‘class Type’ has no member named ‘depth’
         if(t1->depth == t2->depth && check_type(t1->type, t2->type))
                             ^
./src/parser.y:722:53: error: ‘class Type’ has no member named ‘type’
         if(t1->depth == t2->depth && check_type(t1->type, t2->type))
                                                     ^

Я новичок в классах C ++. Почему я получаю эту ошибку и как еще я могу реализовать то, что я пытаюсь сделать здесь?

Редактировать: я изменил часть кода на

Array *ar1 = dynamic_cast<Array*>(t1);
Array *ar2 = dynamic_cast<Array*>(t2);
if(ar1->depth == ar2->depth && check_type(ar1->type, ar2->type))
     return true;

, и проблема была решено.

1 Ответ

0 голосов
/ 20 апреля 2020

Это потому, что, по мнению компилятора, и t1, и t2 являются указателями на «Type», а класс «Type» не имеет членов с именами «глубиной» и «типом». Компилятор не знает, что исходный класс "Array". Я понимаю, что согласно вашей логике c, если (a1 == 3), то тип класса "Массив". Но компилятор этого не знает.

Теперь вопрос в том, как ее решить. Я не уверен, что вы на самом деле пытаетесь достичь с помощью этих классов. Но, учитывая текущее знание вашей проблемы, я могу дать вам только следующее решение.

При достижении этого утверждения (в котором есть ошибка компиляции), так как мы уверены, что тип t1 и t2 равен "Array ", мы можем на самом деле динамически привести их к типу Array *, а затем получить доступ к типу и глубине переменных-членов.

Array* arrT1 = dynamic_cast<Array*> (t1);
Array* arrT2 = dynamic_cast<Array*> (t2);

Теперь вы можете получить доступ к глубине и типу как arrT1-> deep и arrT1-> type (или arrT2-> глубина, arrT2-> тип) как показано ниже

if(arrT1->depth == arrT2->depth && check_type(arrT1->type, arrT2->type))
        return true;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...