Я реализую проверку типов и написал функцию, которая использует два указателя для объектов базового класса и проверяет, представляют ли объекты один и тот же тип.
Это определение базового класса:
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;
, и проблема была решено.