我应该在这个类中构造一个析构函数吗?



我目前正在使用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 Bvector<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

最新更新