我正在学习 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;}
};
还有一个类叫做iZod
; 它的对象代表存储在音乐播放器中的曲目。在iZod
类中必须是一个被调用的嵌套类Track
,它表示包含在播放器中的轨道。每个Track
对象都有一个指向AudioFile
.
现在我有这4个问题:
Track
构造函数必须具有这种形式:Track(AudioFile* f)
并且必须构建一个Track
对象,其指针必须指向 . 指向的对象的副本f
。我的代码对吗?我必须重新定义深层复制、深层分配和深层删除,我已经这样做了,但我有一些疑问:
深拷贝,这是正确的还是我要删除一些东西?
深度作业,对吗?
深度删除;因为在我的两个派生类中我没有数据类型的指针,只做多态调用可以
fa->~AudioAudio()
吗?
class iZod{
private:
class Track{
private:
AudioFile* fa;
public:
// CONSTRUCTOR
Track(AudioFile* f){
fa = f->clone();
}
// DEEP COPY
Track(const Track& b){
fa = b.fa->clone();
}
// DEEP ASSIGNMENT
Track& operator=(const Track& b){
if(this != &b){
fa->~AudioFile();
fa = b.fa->clone();
}
return *this;
}
// DEEP DELETE
~Track(){
fa->~AudioFile();
}
};
vector<Track> v;
public:
...
};