Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在简单层次结构中重新定义深度复制/删除/分配 我学习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 - Fatal编程技术网

在简单层次结构中重新定义深度复制/删除/分配 我学习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;