我正在使用OpenGL进行计算机分配
但我是c ++的新手。它与Java非常不同。
我试过了。
class Map {
private :
public :
short mapkind;
float a = 5;
Map()
{}
};
class Road : public Map {
private :
public :
Road()
{
mapkind = 0;
}
};
class Glass : public Map {
private:
public:
float color[3] = { 0.0, 1.0, 0.0};
Glass()
{
mapkind = 1;
}
};
然后我做了数组。
Map* maps[10] = { new Road(),
new Glass(),
new Road(),
new Glass(),
new Glass(),
new Road(),
new Road(),
new Glass(),
new Road(),
new Glass() };
这是我的主循环。
for (int i = 0; i < 10; i++) {
if ((*maps)[i].mapkind == 0) {
//draw road
Road* temp;
temp = (Road*)maps[i];
}
else if ((*maps)[i].mapkind == 1) {
//draw glass
Glass* temp;
temp = (Glass*)maps[i];
}
else {
//exit(4);
printf("error %hd %d \n", (*maps)[i].mapkind);
}
}
我学会了C和指针,但它已经太老了。我猜在In Array中,推出了新的Class()&#39;因为一个因素是错误的,但我不知道如何解决它。
第一个数字是短类型%hd,第二个数字是int类型%d,用于打印短类型变量&#39; mapkind&#39;
答案 0 :(得分:3)
这里的问题不是转换,而是取消引用数组的方式:
(*maps)[i].mapkind
这是第一次取消引用maps
(它给你maps[0]
),然后你把那个指针用作一个数组,它不是。这会导致未定义的行为。
而是执行maps[i]->mapkind
(或者如果您想使用显式解除引用和点语法(*(maps[i])).mapkind
)。
此外,在使用C ++编程时,你应该“忘掉”C风格的转换,当你最不期望它时,它会导致麻烦。而是使用例如static_cast
:
Glass* temp = static_cast<Glass*>(maps[i]);
或者就像我在评论中提到的那样,使用虚函数,它将使用正确的类在正确的对象中调用。
答案 1 :(得分:0)
除了已经讨论过的内容之外,我认为如果你必须“将一个基类从基类转换为派生类”,那么你做错了。是的,可能是你在整个程序中执行了几次,但规则应该是你在类中有一个为你工作的方法,并且不要将它强制转换为派生类来执行任务。因此,如果您想要绘制对象,则需要Draw
函数:
class Map {
private :
public :
short mapkind;
float a = 5;
Map()
{}
virtual void Draw() = 0;
};
然后为Road
,Glass
等实现此功能
我之所以说“你有时会施放”的原因是,你说有30-40个来自Map
的不同对象,你需要对Aeroplane
做一些特别的事情,这只会发生在一些地方,然后使用铸造它然后做的东西是合理的。我的编译器项目使用llvm::dyn_cast
作为“如果此对象是此类型,则需要执行特殊操作”的方法。
答案 2 :(得分:-1)
。你的基类应该包含至少一个虚函数,即使你必须添加虚析构函数,即:
class Map {
short mapkind;
float a;
public :
Map() : a(5.0f)
{}
virtual ~Map(){}
virtual short getMapkind() const { return mapkind; }
};
在派生类中重写getMapkind函数。 然后你可以使用这样的东西:
vector<Map*> vec;
vec.push_back(new Road());
auto mk = vec.back()->getMapkind();