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;
}
}
答案 0 :(得分:0)
简短的回答是,你不能。将其更改为1D向量也无济于事。
如果要将容器与继承组合在一起,几乎可以肯定需要容器存储某种类似指针或引用的东西,而不是直接存储对象。
根据具体情况,这些可能是std::unique_ptr
或std::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实际上是您希望从中派生另一个类的对象。它必须具有虚拟析构函数,并且任何覆盖方法也应该是虚拟的。