gpt4 book ai didi

c++ - 将子类 Y 插入 std::stack (C++) 后无法使用它的方法

转载 作者:行者123 更新时间:2023-11-28 04:19:59 25 4
gpt4 key购买 nike

我正在尝试创建自己的编程语言。该语言的虚拟机 将使用一个数据堆栈,所有对象都将被插入和弹出。

现在,显然,std::stack只允许将相同类型的元素插入其中,因此我创建了一个非常通用的 Obj类将成为所有其他数据类型的父类,如 Num , Chr等等……

class Obj
{
std::string type;

public:
void set_type(std::string type) { this->type = type; }
std::string get_type() { return this->type; }
};

给你一个Num的例子子类:

class Num : public Obj
{
double value;

public:
Num (double value)
{
this->set_type("num");
this->value = value;
}

double get_value() { return this->value; }
};

问题后来变得很明显......我正在编写 EMIT_CONST 函数,该函数应该从堆栈顶部弹出元素并将其打印到标准输出。为您提供有关事物外观的更多信息:

std::stack<Obj> data;

void emit_const(std::stack<Obj> &data)
{
if ( data.empty() ) return; // some error checking

std::string type = data.top().get_type();

if (type == "bln")
{
Bln bln = data.top(); data.pop();
std::cout << bln.get_value() ? "true" : "false";
}

else if (type == "chr")
{
Chr chr = data.top(); data.pop();
std::cout << chr.get_value();
}

// ... and so on for the rest of the types
}

当我尝试编译它时,GNU g++ 编译器给我一个错误:

conversion from ‘__gnu_cxx::__alloc_traits<std::allocator<Obj> >::value_type {aka Obj}’ 
to non-scalar type ‘Bln’ requested
Bln bln = data.top(); data.pop();

我基本上试图解释 Obj 的每一行代码都给出了同样的错误消息作为其子类,如 BlnNum为了能够使用他们在一般Obj中未定义的方法类。

据我了解,在推送 Obj 的任何实例之后的子类如 Bln进入std::stack<Obj> ,此实例被剥离其未在父级中声明的方法和成员 Obj类(我根据行 std::string type = data.top().get_type(); 不会产生错误的事实推断)。从 C++ 的角度来看,这种行为是合理的。尽管如此,我仍然需要让这个东西工作,并且我需要能够在它们弹出时使用这些项目的方法。请帮助我以有效的方式解决这个问题!提前致谢。

如果您想查看一般代码布局:GitHub Repo

最佳答案

这里有两个问题:get_type需要是虚拟的,当你使用 std::stack<Obj> , 它会删除所有数据。

当您使用 std::stack<Obj> 时,它首先将其转换为 Obj 并删除 num 的所有属性。当您尝试将其转换回其原始类型时,它不能,因为它只存储了 Obj 的属性而不是子类信息。为了解决这个问题,您必须保留对它的引用(std::stack<Obj&>),或者让它制作一个拷贝并将其存储在堆中(std::stack<std::unique_ptr<Obj>>),以便它可以保留来自子类的信息。

其次,你需要申报get_type作为虚拟。 Virtual 是一个关键字,它告诉类存储说明它是什么类型的信息。这允许程序调用正确的方法。如果您不使用它,将始终调用父类版本 (Obj)。

关于c++ - 将子类 Y 插入 std::stack<ParentClass> (C++) 后无法使用它的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55681790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com