私は 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
ます。そのオブジェクトは、音楽プレーヤーに保存されているトラックを表します。IniZod
クラスはTrack
、プレーヤーに含まれるトラックを表すネストされたクラスである必要があります。各Track
オブジェクトには、 へのポリモーフィック ポインタがありAudioFile
ます。
今、私はこれらの4つの質問があります:
Track
コンストラクターは次の形式でなければなりません:Track(AudioFile* f)
および がTrack
指すオブジェクトのコピーをポインターが指す必要があるオブジェクトを構築する必要がありますf
。私のコードは正しいですか?ディープ コピー、ディープ アサイン、ディープ デリートを再定義する必要があり、この方法で実行しましたが、いくつか疑問があります。
ディープコピー、それは正しいですか、それとも何かを削除する必要がありますか?
深い割り当て、それは正しいですか?
深い削除; 私の 2 つの派生クラスでは、データ型にポインターがないため、 polymorphic-call のみを実行しても問題ありませ
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:
...
};