在简单的层次结构中重新定义深层复制/删除/分配

问题描述 投票:0回答:1

我正在学习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中,class必须是一个名为Track的嵌套类,它代表播放器中包含的轨道。每个Track对象都有一个指向AudioFile的多态指针。

现在我有这四个问题:

  1. Track构造函数必须具有以下形式:Track(AudioFile* f)并且必须构建一个Track对象,其指针必须指向f指向的对象的副本。我的代码是对的吗? 我必须重新定义深拷贝,深度分配和深度删除,我已经这样做但我有一些疑问:
  2. 深刻的复制,是正确的还是我要删除的东西?
  3. 深刻的任务,这是正确的吗?
  4. 深度删除;因为在我的两个派生类中,我没有数据类型的指针,是否可以只执行多态调用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:
         ...
};
c++ assign delete-operator deep-copy
1个回答
1
投票

你不应该手动调用析构函数(这几乎不是正确的事情),但由于你的AudioFile成员(fa)是使用new动态分配的,你应该delete它。

更换

fa->~AudioFile();

delete fa;

在赋值和复制构造函数中。

fa的成员是否被动态分配并不重要,fa是重要的。

© www.soinside.com 2019 - 2024. All rights reserved.