Closed. This question is off-topic。它当前不接受答案。
想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
5年前关闭。
我有一个确实很复杂的类,它在另一个类的向量中。我报告了一个简单的问题,无论如何它都存在我能够找到的问题。
现在可以正常工作了(我在几个函数中使用了point_Duck),但是如果我在示例中调用“(* point_Duck)[2] .n_duck;”后执行了类似的操作,则可以这样做。在一个函数中,项目崩溃了。
仅当我这样做时,这种情况才会发生:
并且在使用了一些调用指针的函数之后。
如果我直接做LittleTown(3,5),那是正确的。
我希望我解释得足够好。
想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
5年前关闭。
我有一个确实很复杂的类,它在另一个类的向量中。我报告了一个简单的问题,无论如何它都存在我能够找到的问题。
// the inner class
class DuffyDuck{
int isblack; // 0 is white, 1 is black
int n_duck;
vector<DuffyDuck> * point_Duck;
public:
DuffyDuck(int isblack):isblack(isblack){
}
void set_point(vector<DuffyDuck> & Abitants){
point_Duck=&Abitants;
}
};
// the complessive class
class DuckCity{
vector<DuffyDuck> DuckAbitants;
public:
DuckCity(int numwhite,int numblack){
for(int i=0;i<(numblack+numwhite);++i){
DuckAbitants.push_back(DuffyDuck(i>=numblack));
DuckAbitants[i].set_point(DuckAbitants);
}
}
};
现在可以正常工作了(我在几个函数中使用了point_Duck),但是如果我在示例中调用“(* point_Duck)[2] .n_duck;”后执行了类似的操作,则可以这样做。在一个函数中,项目崩溃了。
仅当我这样做时,这种情况才会发生:
DuckCity LittleTown(0,0);
LittleTown=DuckCity(3,5);
并且在使用了一些调用指针的函数之后。
如果我直接做LittleTown(3,5),那是正确的。
我希望我解释得足够好。
最佳答案
DuffyDuck
类存储vector<>
的DuckCity
成员的地址。因此,当您将DuckCity
复制到另一个实例时,该新实例将具有另一个vector<>
实例。但是,该向量中的每个DuffyDuck
实例仍然具有旧DuckCity
实例的一部分的地址。
因此,复制到littleTown
会产生悬空的指针。
我建议您要么重新考虑DuffyDuck
的设计,要么实现DuckCity
的赋值运算符,该赋值运算符为vector<>
的每个元素执行深层复制。如果您实现赋值运算符,请记住也要遵循Rule of Three。
09-15 14:03