在简单层次结构中重新定义深度复制/删除/分配 我学习C++,对这个编程练习中的深层复制、删除和分配有一些疑问;我有一个抽象基类的简单层次结构: class AudioFile{ private: string title; double size; public: AudioFile(string t, double d): title(t), size(d){} virtual AudioFile * clone() = 0; virtual bool quality() const = 0; string getTitle() const{ return title;} double getSize() const{ return size;} virtual ~AudioFile(){} }; class Mp3: public AudioFile{ private: int bitRate; public: Mp3(string t, double d, int b): AudioFile(t,d), bitRate(b){} virtual Mp3 * clone(){ Mp3 * t = new Mp3(getTitolo(),getDim(),bitRate); return t; } virtual bool quality() const{ if(bitRate >= 192) return true; else return false; } int getBitrate() const{ return bitRate;} }; class WAV: public AudioFile{ private: int freq; // in kHz bool lossless; public: WAV(string t, double d, int f, bool l): AudioFile(t,d), freq(f), lossless(l){} virtual WAV * clone(){ WAV * t = new WAV(getTitolo(),getDim(),freq,lossless); return t; } virtual bool quality() const{ if(freq >= 96) return true; else return false; } int getFreq() const{ return freq;} bool isLossless() const{ return lossless;} };
还有一个类叫做在简单层次结构中重新定义深度复制/删除/分配 我学习C++,对这个编程练习中的深层复制、删除和分配有一些疑问;我有一个抽象基类的简单层次结构: class AudioFile{ private: string title; double size; public: AudioFile(string t, double d): title(t), size(d){} virtual AudioFile * clone() = 0; virtual bool quality() const = 0; string getTitle() const{ return title;} double getSize() const{ return size;} virtual ~AudioFile(){} }; class Mp3: public AudioFile{ private: int bitRate; public: Mp3(string t, double d, int b): AudioFile(t,d), bitRate(b){} virtual Mp3 * clone(){ Mp3 * t = new Mp3(getTitolo(),getDim(),bitRate); return t; } virtual bool quality() const{ if(bitRate >= 192) return true; else return false; } int getBitrate() const{ return bitRate;} }; class WAV: public AudioFile{ private: int freq; // in kHz bool lossless; public: WAV(string t, double d, int f, bool l): AudioFile(t,d), freq(f), lossless(l){} virtual WAV * clone(){ WAV * t = new WAV(getTitolo(),getDim(),freq,lossless); return t; } virtual bool quality() const{ if(freq >= 96) return true; else return false; } int getFreq() const{ return freq;} bool isLossless() const{ return lossless;} };,c++,assign,delete-operator,deep-copy,C++,Assign,Delete Operator,Deep Copy,还有一个类叫做iZod;其对象表示存储在音乐播放器中的曲目。 在iZod中,类必须是一个名为Track的嵌套类,该类表示播放器中包含的曲目。每个曲目对象都有一个指向音频文件的多态指针 现在我有四个问题: Track构造函数必须具有以下形式:Track(AudioFile*f)并且必须构建一个Track对象,其指针必须指向f指向的对象的副本。我的代码对吗 我必须重新定义深度复制、深度分配和深度删除,我已经这样做了,但我有一些疑问: 深度复制,是正确的还是我必须删除一些东西 深度作业,对吗 深度删除
iZod
;其对象表示存储在音乐播放器中的曲目。
在iZod
中,类必须是一个名为Track
的嵌套类,该类表示播放器中包含的曲目。每个曲目
对象都有一个指向音频文件
的多态指针
现在我有四个问题:
Track
构造函数必须具有以下形式:Track(AudioFile*f)
并且必须构建一个Track
对象,其指针必须指向f
指向的对象的副本。我的代码对吗
我必须重新定义深度复制、深度分配和深度删除,我已经这样做了,但我有一些疑问:fa->~AudioAudio()
可以吗class-iZod{
私人:
班级轨道{
私人:
音频文件*fa;
公众:
//建造师
曲目(音频文件*f){
fa=f->clone();
}
//深度复制
轨道(施工轨道和b){
fa=b.fa->clone();
}
//深度作业
轨道和操作员=(常数轨道和b){
如果(此!=&b){
fa->~AudioFile();
fa=b.fa->clone();
}
归还*这个;
}
//深度删除
~Track(){
fa->~AudioFile();
}
};
向量v;
公众:
...
};
您不应该手动调用析构函数(这几乎从来都不是正确的做法),但是由于您的音频文件成员(fa
)是使用new
动态分配的,您应该删除它
替换
fa->~AudioFile();
与
在赋值和复制构造函数中
fa
的成员是否被动态分配并不重要,重要的是fa
被动态分配 你应该用谷歌搜索“三法则”或者更好的“零法则”。@LightnessRacesinOrbit我是这个意思。现在更正。
fa->~AudioFile();
delete fa;