【发布时间】:2020-08-02 23:39:15
【问题描述】:
我正在实现类型检查并编写了一个函数,该函数接受两个指向基类对象的指针并检查对象是否表示相同的类型。
这是基类定义:
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;
}
}
如您所见,该函数检查两个对象是否相同。
从函数中访问派生类成员 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++ 类的新手。 为什么我会收到此错误,我还能如何实现我在这里尝试做的事情?
编辑: 我将部分代码更改为
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 更改为数组 *a1。实际上,类型类没有名为 depth 的成员。拥有这些成员的是 Array 类。
-
t1和t2是指向Type的指针,而不是指向Array的指针。如果您需要访问Array成员并且知道t1和t2确实是指向Array对象的指针,则需要将(static_cast或dynamic_cast)指针转换为正确的类型。 -
有些程序员老兄在这里有更好的观点,这就是我的意思
-
@Adrisui3 目前,我只编写了从 Type 派生的几个类之一。所以,我最终不得不在这个函数中处理几个可能的 Type 子类。从 Type *t1 更改为 Array *t2 意味着为每种可能的“类型”类型创建一个单独的函数。但是,我希望这样,每当我有两种类型时,我都可以使用 check_type(t1, t2) 来检查它们是否相同,其中 t1 和 t2 是引用。
-
@Someprogrammerdude 是的,解决了它。
标签: c++ class oop compiler-construction derived-class