0

私は 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つの質問があります:

  1. Trackコンストラクターは次の形式でなければなりません:Track(AudioFile* f)および がTrack指すオブジェクトのコピーをポインターが指す必要があるオブジェクトを構築する必要がありますf。私のコードは正しいですか?

    ディープ コピー、ディープ アサイン、ディープ デリートを再定義する必要があり、この方法で実行しましたが、いくつか疑問があります。

  2. ディープコピー、それは正しいですか、それとも何かを削除する必要がありますか?

  3. 深い割り当て、それは正しいですか?

  4. 深い削除; 私の 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:
         ...
};
4

1 に答える 1

1

デストラクタを手動で呼び出すべきではありません (正しいことはほとんどありません) が、AudioFileメンバー ( fa) は を使用して動的に割り当てられるため、呼び出すnew必要がありますdelete

交換

fa->~AudioFile();

delete fa;

代入コンストラクターとコピー コンストラクターの両方で。

faのメンバーが動的に割り当てられたかどうかは問題ではありません。重要なのは、それfaがあったということです。

于 2013-08-13T13:18:52.903 に答える