gpt4 book ai didi

c++ - 设计一个良好的 C++ 包装器类来包装多个功能

转载 作者:搜寻专家 更新时间:2023-10-31 01:02:43 25 4
gpt4 key购买 nike

我想用 C++ 设计一个包装类,实现使用 FTP、SFTP 进行文件传输。

我有一个由派生类 FTP 继承的基类 FileTransfer(使用 curl)。我需要支持 SFTP,所以我实现了另一个派生类 SFTP,它也继承自 FileTransfer

我正在按照以下几行编写包装器类代码。然而,这看起来不像是好的设计。我对 OOP 比较陌生,尽管我过去曾使用过 C。

class Wrapper {
public:
Wrapper(int m_protocol){
protocol = m_protocol;
if (protocol)
pftp = new FTP();
else
psftp = new SFTP();
}

~Wrapper() {
if (protocol)
delete pftp;
else
delete psftp;
}
//Function supported by both ftp/sftp
void do_something(){
if (protocol)
pftp->do_something();
else
psftp->do_something();
}

//FTP specific function
void use_passive(){
assert(protocol);
pftp->use_passive();
}

//SFTP specific function
void ssh_key(){
assert(!protocol);
psftp->ssh_key();
}

private:
int protocol;
FTP *pftp;
SFTP *psftp;
};

我该如何改进这个设计?如何避免 if (protocol) 检查每个函数并提高代码质量?我是否应该为 psftp 和 'pftp` 使用 void 指针?

编辑:我正在使用一个包装器,因为在项目的很多地方,正在使用现有的 FTP 对象,如果我为 SFTP 使用一个单独的类(没有包装器),我将不得不添加一个 if 每次检查也支持 SFTP。我不想向调用者公开详细信息 (FTP/SFTP)。

最佳答案

只需使用您的基类指针,这里的一切都可以更轻松地完成。

FileTransfer* ft;
std::unique_ptr<FileTransfer> ft; // C++11

制作一个:

// should this really be an int?
FileTransfer* factory(int protocol) {
if (protocol)
return new FTP;
else
return new SFTP;
}

// in C++11 this should be
std::unique_ptr<FileTransfer> factory(int protocol);

做某事:

ft->do_something();

做一些特定于一个或另一个的事情:

// this will die if ft is an SFTP
dynamic_cast<FTP*>(ft)->use_passive();

// but you could check it
if (FTP* ftp = dynamic_cast<FTP*>(ft)) {
ftp->use_passive();
}

// or perhaps even better, make a default virtual that does nothing
virtual void FileTransfer::use_passive() { }

void FTP::use_passive() override { // whatever }

ft->use_passive();

删除:

// make sure FileTransfer::~FileTransfer() is virtual!!
delete ft;

关于c++ - 设计一个良好的 C++ 包装器类来包装多个功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26690901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com