当其中有多个不同的派生类时,难以实现抽象基类类型的C++数组

63lcw9qa  于 2022-12-05  发布在  其他
关注(0)|答案(1)|浏览(68)

我们正在为一个OOP C++类编写一个棋盘游戏,其中不同的空间需要有不同类型的成员数据,但我们也希望能够快速访问任何空间的数据。
我们现在的设计是由一个长度为40的"board"数组组成的,它的类型是"space"指针。Space是一个完全抽象的类,其中有一个虚函数。这个虚函数是doSpaceAction()。我们的想法是从这个基类创建7个不同的派生类,这些派生类将有相应的成员数据以及它们自己独特的doSpaceAction()实现。
这个问题是在指向派生类的示例的指针被赋值到黑板上的一个空格后,试图访问派生类的成员数据。下面是一些类似于我们正在尝试做的代码。我们都是OOP的新手,所以我们不能非常肯定这是一个糟糕的设计,还是我们只是没有做到。我知道编译器可以区分派生类指针存储的内容,它可以调用doSpaceAction()的正确版本,但我就是不知道访问成员数据的正确语法是什么(如果有的话

#include<iostream>

class Space{
public:
    virtual void doSpaceAction()=0;
};

class spaceType1 : public Space{
public:
    int data1;
    int data2;

    spaceType1(int data1 = 0, int data2 = 0){
        this->data1 = data1;
        this->data2 = data2;
    }
    void doSpaceAction(){
        std::cout<<data1<<std::endl;
    }
};

class spaceType2 : public Space{
public:
    int data3;
    int data4;

    spaceType2(int data1 = 0, int data2 = 0){
        this->data3 = data1;
        this->data4 = data2;
    }
    void doSpaceAction(){
        std::cout<<data3<<std::endl;
    }
};

int main(){
    Space * Board[40];
    spaceType1 * temp1 = new spaceType1(100, 100);
    Board[0] = temp1;
    spaceType2 * temp2 = new spaceType2(200, 200);
    Board[1] = temp2;

    Board[0]->doSpaceAction(); // outputs 100 as expected
    Board[1]->doSpaceAction(); // outputs 200 as expected
    
    
    //These two lines do not work
    //Board[0]->data1
    //Board[1]->data3

}
eqqqjvef

eqqqjvef1#

在这里,编译器将Board[0]Board[1]视为指向Space类型对象的指针,并且不确认继承的类。
因此,您可以:

dynamic_cast<spaceType1*>(Board[0])->data1 = (value);

dynamic_cast<spaceType2*>(Board[1])->data3 = (value);

相关问题