我可以将RectangleShapes push_back转换为继承RectangleShape的类的2d向量吗?

时间:2017-10-27 01:30:58

标签: c++

class tile :public RectangleShape
{
public:
int w;
int t1rgb1;
int t1rgb2;
int t1rgb3;
int t2rgb1;
int t2rgb2;
int t2rgb3;

void modify(int,int,int,int,int,int,int);
};

我有一个继承RectangleShape的tile类。我已经制作了这个类的2d Vector,并希望将push_back矩形形状从另一个类的方法中导入到它中。我知道我的代码不起作用,因为我不知道我的RectangleShape将被推送到哪里,x或y。

    board::create(int x, int y){
    cBoard = vector <vector <tile> >(x, vector< tile >(y, tile()));
    int counter = 0;
    RectangleShape t;

    for(int i = 0; i < y; i++){
        counter = 0;
        if(i % 2 == 1){
            counter = 1;
                }
    for(int ii = 0; ii < x; ii++){
        if(counter % 2 == 0){
            t.setFillColor(Color::Red);
            cBoard.push_back(t);
            cout << "red";
            counter++;
        }
        else if(counter % 2 == 1){
            t.setFillColor(Color::Green);
            cBoard.push_back(t);
            cout << "green";
            counter++;
        }
    }
    cout << endl;
}
}

2 个答案:

答案 0 :(得分:0)

简短的回答是,你不能。将其更改为1D向量也无济于事。

如果要将容器与继承组合在一起,几乎可以肯定需要容器存储某种类似指针或引用的东西,而不是直接存储对象。

根据具体情况,这些可能是std::unique_ptrstd::reference_wrapper,或者可能只是Boost ptr_vector之类的原始指针。但是,无论如何,如果你使用继承,你只需要通过类似指针或类似引用的东西来处理对象,而不是直接使用对象本身。

答案 1 :(得分:0)

执行此类操作的方法是使用dynamic_cast和store指针,而不是值。例如:

RectangleShape r1 = new RectangleShape();
RectangleShape r2 = new tile();

tile* t1 = dynamic_cast<tile>(r1);
tile* t2 = dynamic_cast<tile>(r2);

在上面的代码片段中,t1将为nullptr,因为r1不是tile对象。 t2将指向正确的tile对象。将指针存储在向量中可能应该使用unique_ptr来防止内存管理问题。

如果这不是您想要做的,如果您想从RectangleShape对象中实际创建一个tile对象,那么您需要为tile类赋予一个构造函数,该构造函数接受一个RectangleShape对象(最好是显式的),或者创建一个接受RectangleShape对象并返回tile对象的函数。

最后,确保在执行此操作时,RectangleShape实际上是您希望从中派生另一个类的对象。它必须具有虚拟析构函数,并且任何覆盖方法也应该是虚拟的。