C++ 复制构造函数会丢失某些属性
我有一个类C++ 复制构造函数会丢失某些属性,c++,copy-constructor,C++,Copy Constructor,我有一个类块的副本构造函数 Block::Block(const Block& p_block):Drawable(p_block) { } 它继承自类Drawable Drawable::Drawable(const Drawable& p_drawable) { sprite = p_drawable.sprite; texture = p_drawable.texture; x = p_drawable.x; y = p_drawable.
块的副本构造函数
Block::Block(const Block& p_block):Drawable(p_block) {
}
它继承自类Drawable
Drawable::Drawable(const Drawable& p_drawable) {
sprite = p_drawable.sprite;
texture = p_drawable.texture;
x = p_drawable.x;
y = p_drawable.y;
}
我使用指针来存储对象,但尝试切换到不使用指针,现在精灵和纹理丢失了。我很确定我对引用/指针的使用是错误的
绘制方法:
void Room::draw(sf::RenderWindow &p_window) {
for(auto& block : blocks) {
block.draw(p_window);
}
...
}
可以包含任何其他必要的代码。只是想知道我在复制构造函数中是否做错了什么,或者我是否真的应该使用指针
我也用它来处理碰撞,不确定这里是否有什么东西会引起问题
struct sortBlocksByDistance {
Drawable *drawable;
sortBlocksByDistance(Drawable* p_drawable) {
this->drawable = p_drawable;
}
bool operator () (Block* a, Block* b) {
float adx = a->x - drawable->x,
ady = a->y - drawable->y,
adist = adx * adx + ady * ady;
float bdx = b->x - drawable->x,
bdy = b->y - drawable->y,
bdist = bdx * bdx + bdy * bdy;
return adist < bdist;
}
};
std::vector<Block*> Room::detectCollisions(Drawable *p_drawable) {
std::vector<Block*> hitBlocks;
for(auto& block : blocks) {
if(block.collidesWith(p_drawable)) {
hitBlocks.push_back(&block);
}
}
std::sort(hitBlocks.begin(), hitBlocks.end(), sortBlocksByDistance(p_drawable));
return hitBlocks;
};
std::vector<Block*> collisions = detectCollisions(player);
player->solveCollisions(collisions);
void Drawable::solveCollisions(std::vector<Block*> p_blocks) {
while(p_blocks.size()) {
Block &block = *p_blocks.front();
// x/y manipulation
// pop front
p_blocks.front() = std::move(p_blocks.back());
p_blocks.pop_back();
}
};
struct sortBlocksByDistance{
可拉伸*可拉伸;
分拣锁液压距离(可牵引*p_可牵引){
此->可绘制=p_可绘制;
}
布尔运算符()(块*a,块*b){
浮动adx=a->x-可拉伸->x,
ady=a->y-可拉伸->y,
adist=adx*adx+ady*ady;
浮动bdx=b->x-可绘制->x,
bdy=b->y-可拉伸->y,
bdist=bdx*bdx+bdy*bdy;
返回adist解决碰撞(碰撞);
void Drawable::solveCollisions(标准::向量p_块){
while(p_blocks.size()){
Block&Block=*p_blocks.front();
//x/y操纵
//流行前沿
p_blocks.front()=std::move(p_blocks.back());
p_blocks.pop_back();
}
};
复制构造函数看起来不错。您是否确保正确实施了该计划?这也是一个常见问题。std::vector
更好的应该是std::vector
或std::vector
@πάνταῥεῖ 或者更好的方法是;)