2016-02-14 28 views
0

作为学校作业的一部分,我们必须创建一个抽象类并使用一个寄存器类来包含它们。抽象类有两个下类。 喜欢动物>狗/猫赋值操作符创建指针并且不会使删除成为可能

在这个任务中,我们必须做一个赋值操作符,但是在使用我所做的那个之后,程序出了问题。

我制作了两个寄存器

r1; r2;

然后使用运营商

r2 = r1;

,并在程序退出时,它进入R1的destruktor,删除它,到达R2,并得到“访问冲突读取位置”

我猜这是因为运营商创建了一个从指针r2到r1,所以当r1被删除时。

运营商:

Register& Register::operator=(Registerconst &other) 
{ 
    for (int i = 0; i < this->count; i++) 
    { 
     delete this->animals[i]; 
    } 
    delete[] this->animals; 
    this->name = other.name; 
    this->size = other.size; 
    this->count = other.count; 
    this->animals= new Animal*[this->size]; 
    for (int i = 0; i < this->count; i++) 
    { 
     animals[i] = other.animals[i]; 
    } 
    for (int i = count; i < this->size; i++) 
    { 
     this->animals[i] = nullptr; 
    } 
    return *this; 
} 

的析构函数不是虚拟的。不知道这是导致它

由于要求在此处,它被用来

AnimalRegister r1("Name 1"); 
AnimalRegister r2("Name 2"); 
// some stuff being added to r1 
r2 = r1; 
return 0; 

构造的地方:

AnimalRegister::AnimalRegister(string name) 
{ 
    this->name = name; 
    this->size = 10; 
    this->count = 0; 
    this->animals = new Animal*[this->size]; 
    for (int i = 0; i < this->size; i++) 
     animals[i] = nullptr; 
} 

析构函数:

AnimalRegister::~AnimalRegister() 
{ 
    for (int i = 0; i < this->count; i++) 
     delete animals[i]; 
    delete[] animals; 
} 
+1

难道这只是我不知道的OOP术语吗?什么是“注册课程”? –

+0

你想要什么被称为[共享指针](http://en.cppreference.com/w/cpp/memory/shared_ptr)。你可以阅读_implementation detail_部分找到想法,如果你想自己创建。 – Lol4t0

+0

@CodyGray可能只是翻译问题,如果指定原本不是英文的 – Lol4t0

回答

1

原因你获取访问冲突是您试图删除动物指针两次。您的注册分配操作员将来自源对象的动物指针复制到目标对象。 Register类的析构函数删除了它所容纳的动物指针 - 因为这些动态指针在r1和r2中是相同的,所以当你第二次尝试并删除它们时,会遇到访问冲突。

您需要决定谁拥有动物指针。你的问题没有给我足够的信息来确定。

如果注册类以外的东西拥有动物,注册类不应删除它们。

如果注册类拥有它们,您需要通过Animal上的某种虚拟clone()方法制作动物的深层副本。

如果共享所有权,您应该使用std :: shared_ptr来保存动物。

+0

我已将构造函数和析构函数添加到我的原始文章中。 赋值运算符不应该使r2成为r1的副本吗?或者它应该把它变成一个指针? 也许如果我在r1之前创建了r2,那么r2会先被删除呢? –

+0

@Frank Hansen这取决于你的意思是“制作副本”。如果每个登记册都应该拥有它自己拥有的动物副本,那么当你复制一个登记册时,你需要为寄存器将保存的每个动物创建一个新副本(这是我在答案中提到的“深层副本”)。如果寄存器只是一些其他地方存储的动物主要列表中的一组动物,则动物主列表应该删除动物或动物应存储在shared_ptrs中。 – myrkle

+0

在阅读了更多的主题后,我发现我需要一个克隆/复制函数,它返回对象Cat/Dog的新实例。 –