派生的 class 成员无法从将指向基 class 的指针作为参数的函数中访问?
Derived class members inaccessible from within a function that takes pointer to base class as parameter?
我正在实施类型检查并编写了一个函数,该函数接受两个指向基础 class 对象的指针并检查这些对象是否表示相同类型的 not。
这是基础 class 定义:
class Type {
public:
virtual int get_type(void) { return 1; };
string name;
Type(){};
Type(string n)
{
name = n;
}
};
目前,我有一个派生的class,如下所示:
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;
}
}
如您所见,该函数检查两个对象是否相同。
当从函数中访问派生的 class 成员 depth 和 type 时,出现以下错误:
./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++ 新手 classes。
为什么我会收到此错误以及我还可以如何实现我在这里尝试做的事情?
编辑:
我将一部分代码更改为
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;
问题已解决。
这是因为在编译器看来,t1和t2都是指向"Type"的指针,而class"Type"没有任何名为[=22=的成员] 和 "type"。编译器不知道原来的class是"Array"。我知道按照你的逻辑,if(a1 == 3) 那么 class 的类型是 "Array"。但是编译器不知道。
现在的问题是如何解决。我不确定您实际上想用这些 classes 实现什么。但以目前对你问题的了解,我只能给你以下解决方案。
在到达这个语句(有编译错误)时,因为我们确定 t1 和 t2 的类型是 "Array",我们实际上可以动态地将它们转换为 Array* 类型,然后访问成员变量类型和深度。
Array* arrT1 = dynamic_cast<Array*> (t1);
Array* arrT2 = dynamic_cast<Array*> (t2);
现在您可以访问深度和类型,如下所示
if(arrT1->depth == arrT2->depth && check_type(arrT1->type, arrT2->type))
return true;
我正在实施类型检查并编写了一个函数,该函数接受两个指向基础 class 对象的指针并检查这些对象是否表示相同类型的 not。
这是基础 class 定义:
class Type {
public:
virtual int get_type(void) { return 1; };
string name;
Type(){};
Type(string n)
{
name = n;
}
};
目前,我有一个派生的class,如下所示:
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;
}
}
如您所见,该函数检查两个对象是否相同。
当从函数中访问派生的 class 成员 depth 和 type 时,出现以下错误:
./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++ 新手 classes。 为什么我会收到此错误以及我还可以如何实现我在这里尝试做的事情?
编辑: 我将一部分代码更改为
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;
问题已解决。
这是因为在编译器看来,t1和t2都是指向"Type"的指针,而class"Type"没有任何名为[=22=的成员] 和 "type"。编译器不知道原来的class是"Array"。我知道按照你的逻辑,if(a1 == 3) 那么 class 的类型是 "Array"。但是编译器不知道。
现在的问题是如何解决。我不确定您实际上想用这些 classes 实现什么。但以目前对你问题的了解,我只能给你以下解决方案。
在到达这个语句(有编译错误)时,因为我们确定 t1 和 t2 的类型是 "Array",我们实际上可以动态地将它们转换为 Array* 类型,然后访问成员变量类型和深度。
Array* arrT1 = dynamic_cast<Array*> (t1);
Array* arrT2 = dynamic_cast<Array*> (t2);
现在您可以访问深度和类型,如下所示
if(arrT1->depth == arrT2->depth && check_type(arrT1->type, arrT2->type))
return true;