我尝试了几天才制作这个小代码,但它不起作用。我看到很多关于这个问题的问题,但我没有找到答案。
以下是Voiture.cpp的代码:
#include <iostream>
using namespace std;
#include <string.h>
#include "modele.h"
Voiture::Voiture()
{
Nom=NULL;
setNom("Default");
VoitChoix=Modele();
cout << "COnstructeur default" << endl;
}
Voiture::Voiture(const char* N,const Modele V)
{
Nom=NULL;
setNom(N);
setModele(V);
cout << "COnstructeur initialisation" << endl;
}
Voiture::Voiture(const Voiture& V)
{
Nom=NULL;
setNom(V.getNom());
setModele(V.getModele());
cout << "COnstructeur copie" << endl;
}
Voiture::~Voiture()
{
if(Nom)
{
cout << "Voiture : Destruction de" << Nom << endl;
delete [] Nom;
}
}
以下是Modele.cpp的代码:
#include <iostream>
#include <string.h>
using namespace std;
#include "modele.h"
Modele::Modele()
{
Nom=NULL;
setNom("Default");
Puissance=0;
Diesel=true;
PrixDeBase=0;
cout << "COnstructeur default" << endl;
}
Modele::Modele(const char* N,const int P,const bool D,const float PDB)
{
Nom=NULL;
setNom(N);
setPuissance(P);
setDiesel(D);
setPrixDeBase(PDB);
cout << "COnstructeur initialisation" << endl;
}
Modele::Modele(const Modele& M)
{
Nom=NULL;
setNom(M.getNom());
setPuissance(M.getPuissance());
setDiesel(M.isDiesel());
setPrixDeBase(M.getPrixDeBase());
cout << "COnstructeur copie" << endl;
}
Modele::~Modele()
{
if(Nom)
{
cout << "Modele: Destruction de" << Nom << endl;
delete [] Nom;
}
}
以下是main.cpp的代码:
int main()
{
cout << "(1) ***** Test du constructeur par defaut de Voiture *****" << endl;
{
Voiture voiture;
voiture.Affiche();
}
}
我没有把所有代码放在我遇到问题的地方。
谢谢! :(
答案 0 :(得分:1)
一个明显的问题是您缺少用户定义的赋值运算符:
VoitChoix=Modele();
这会调用赋值运算符,而不是复制构造函数。由于您没有Modele
的用户定义的赋值运算符,因此您将遇到有关VoitChoix
销毁的问题。更具体地说,您要将Modele()
创建的所有值分配给VoitChoix
。
因此,您有两个具有Nom
指针值的实例。当临时Modele()
超出范围时,它将调用析构函数,从而删除Nom
。当VoitChoix
超出范围时,它将尝试删除Nom
的相同指针值。因此双重删除错误。
Modele
的用户定义的赋值运算符将具有以下签名:
Modele& operator=(const Modele&);
在继续之前,您需要实现此功能。这可以使用copy/swap
成语What is the copy-and-swap idiom?
另外,请在创建课程时遵循三条规则:What is The Rule of Three?