我正在将 zip 和 rar 档案中的文件提取到原始缓冲区中。我创建了以下内容来包装 minizip 和 unrarlib:
Archive.hpp - 用于访问所有内容。如果我可以让其他类中的所有功能都无法从外部访问,我会的。(实际上,我想我可以成为 Archive 中所有其他类的朋友,并使用私有函数回调......,但这太迂回了。)
#include "ArchiveBase.hpp"
#include "ArchiveDerived.hpp"
class Archive {
public:
Archive(string path) {
/* logic here to determine type */
switch(type) {
case RAR:
archive_ = new ArchiveRar(path);
break;
case ZIP:
archive_ = new ArchiveZip(path);
break;
case UNKNOWN_ARCHIVE:
throw;
break;
}
}
Archive(Archive& other) {
archive_ = // how do I copy an abstract class?
}
~Archive() { delete archive_; }
void passThrough(ArchiveBase::Data& data) { archive_->passThrough(data); }
Archive& operator = (Archive& other) {
if (this == &other) return *this;
ArchiveBase* newArchive = // can't instantiate....
delete archive_;
archive_ = newArchive;
return *this;
}
private:
ArchiveBase* archive_;
}
档案库.hpp
class ArchiveBase {
public:
// Is there any way to put this struct in Archive instead,
// so that outside classes instantiating one could use
// Archive::Data instead of ArchiveBase::Data?
struct Data {
int field;
};
virtual void passThrough(Data& data) = 0;
/* more methods */
}
ArchiveDerived.hpp "Derived" 是 "Zip" 或 "Rar"
#include "ArchiveBase.hpp"
class ArchiveDerived : public ArchiveBase {
public:
ArchiveDerived(string path);
void passThrough(ArchiveBase::Data& data);
private:
/* fields needed by minizip/unrarlib */
// example zip:
unzFile zipFile_;
// example rar:
RARHANDLE rarFile_;
}
ArchiveDerived.cpp
#include "ArchiveDerived.hpp"
ArchiveDerived::ArchiveDerived(string path) { //implement }
ArchiveDerived::passThrough(ArchiveBase::Data& data) { //implement }
有人建议我使用这种设计,以便我可以这样做:
Archive archiveFile(pathToZipOrRar);
archiveFile.passThrough(extractParams); // yay polymorphism!
如何为存档编写 cctor?
归档的 op= 怎么样?
我能做些什么“重命名”
ArchiveBase::Data
到Archive::Data
?(minizip 和 unrarlib 都使用此类结构进行输入和输出。数据对于 Zip 和 Rar 是通用的,后来用于创建各自库的结构。)其他所有内容都通过 访问Archive
,我想Data
在外部类中声明这种方式也是如此。
我知道我可以将我的 current class Archive
、 nameArchiveBase
扔到Archive
中,并使用全局工厂函数。但是,我想避免使用全局函数。