我目前正在使用c++构建一个ABM模型。
我有需要相互交互的类,因为例如类B需要检查类A中的值并返回一些对它的评估,然后类C可能想要读取。类不需要改变其他类的值,只需要从它们中读取。
类B在我当前的实现中有一个po指向包含类a的所有成员的vector。指针在那里有两个原因:它使vector的初始化更容易,并且vector留在main的作用域中,这样我就可以访问和遍历它,为每个代理调用类a的成员。
我MCVE:
#include <iostream>
#include <vector>
using namespace std;
class A; // Forward declaration
class B{
int id,
some_value;
vector<A> * A_vec;
public:
// Overloaded constructor
B(int ID, vector<A> & PTR)
{
A_vec = & PTR;
id = ID;
some_value = 0;
};
// Copy Constructor
B( const B& that ):
id(that.id),
some_value(that.some_value)
{
// Pointer ??
};
// Non-default destructor -> uncomment leads to seg_fault
/*
~B(){ delete [] A_vec;};
*/
// Assignment operator
B& operator=(const B& that)
{
id = that.id;
some_value = that.some_value;
// Pointer ??
return *this;
};
//Methods to update different variables go here ..
void do_stuff();
};
class A{
B & class2_ref;
vector<double> o;
public:
int stuff;
// Overloaded constructor
A(int STUFF, B & REF, vector<double> O):
class2_ref(REF),
o(O)
{
stuff = STUFF;
};
// Methods to update different variables go here ..
};
void B::do_stuff()
{
int L = A_vec->size();
for(int l = 0; l<L; l++) some_value += (*A_vec)[l].stuff; // Perform some operation
};
int main(){
int I = 5; // Number of objects of A
vector<double> O(12,2); // Some numbers in here
B b(0,A_vec);
for(int i = 0; i< I; i++)
{
A a(i,b,O);
A_vec.push_back(a);
}
b.do_stuff();
cout<< "Debugging MCVE" << endl;
return 0;
}
我的问题是:
应该在类B中实现析构函数/复制构造函数/赋值操作符吗?A级怎么样?如果是这样,你能告诉我正确的语法吗(上面注释中的析构函数会导致segfault)。
我的理解是,这可能是我对指针的"浅层"销毁感到满意的情况之一,因为class B
和vector<A>
将在返回语句时超出作用域。class B
拥有指针,该指针在到期时被销毁,vector也是如此。
那么,三法则的另一个元素呢?
只计划了一个B类的对象,但我可能(可能性很小)稍后想要推广
如果一个类有一个指针类型,你应该实现一个析构函数,我建议也实现一个复制和一个赋值操作符,否则你将从两个不同的地方处理同一个对象,这可能会导致你一些错误,例如-
void someFunction(B &b)
{
B a = b;
}
B b(0,A_vec);
someFunction(b); //After finishing someFunction, it will try to delete the vector from a , but it is the same vector you used in b.
b.do_stuff(); // Would cause a seg error
对于析构函数语法,只需删除vector,而不是其内容,它将在内容上使用vector的默认析构函数:
delete A_vec
只是确保你不使用它,如果它没有初始化,我建议只是建立一个空向量上的每一个类,这样你就不会得到一个段错误,你可以使用delete