从父类中转发元素

时间:2016-03-14 07:07:22

标签: c++ arrays oop pointers downcast

我正在使用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;因为一个因素是错误的,但我不知道如何解决它。

first number is short type %hd and second one is int type %d for printing short type variable 'mapkind'

第一个数字是短类型%hd,第二个数字是int类型%d,用于打印短类型变量&#39; mapkind&#39;

3 个答案:

答案 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;
};

然后为RoadGlass等实现此功能

我之所以说“你有时会施放”的原因是,你说有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();