CIndent和CCSV有相同的父类,这就是我在printFile中传递的,使用If或SWITCH声明变量这个好主意吗?
if (fileFormat==1)
CIndent codecWrite;
else
CCSV codecWrite;
route.prinFile(filename,codecWrite);
你还有其他方法吗?为什么?怎么样 ?
答案 0 :(得分:3)
你在寻找像
这样的东西吗?std::unique_ptr<CodecWrite> codecwrite;
if (fileFormat==1)
codecWrite.reset( new CIndent() );
else
codecWrite.reset( new CCSV() );
if(codecWrite)
route.prinFile(filename,*codecWrite);
如果您有更多文件格式来管理,则应考虑 switch
std::unique_ptr<CodecWrite> codecwrite;
switch(fileFormat) {
case 1:
codecWrite.reset( new CIndent() );
break;
case 2:
/** I don't know an appropriate class **/
codecWrite.reset( new AnotherCodecWrite );
break;
default:
codecWrite.reset( new CCSV() );
break;
}
if(codecWrite)
route.prinFile(filename,*codecWrite);
答案 1 :(得分:2)
而不是无效代码
if (fileFormat==1)
CIndent codecWrite;
else
CCSV codecWrite;
route.prinFile(filename,codecWrite);
......只做
route.prinFile( fileFormat == 1? baseRef( CIndent() ) : baseRef( CCSV() ) );
其中baseRef
就是这样。
auto baseRef( Base&& o ) -> Base& { return o; }
这依赖于保证在完整表达式结束时销毁临时对象,而不是之前。
顺便说一下,我建议将prinFile
重命名为printFile
。
答案 2 :(得分:1)
在这种情况下,我不建议采用任何一种方法。 switch
和长链if-else if-else
结构通常是C ++中的代码味道,这种情况也不例外。如果你想将映射一组类型ID映射到一组类,那么使用适当的数据结构,在你的情况下是一个数组(如果你知道你的类型ID将永远是连续的)整数),或更一般地说,查找表。前者是使用std::array
实现的,后者在现代C ++中使用std::unordered_map
实现。
enum FileFormat {
Indent,
CSV
};
class FileWriter {
virtual ~FileWriter() {}
// etc.
};
class IndentWriter : FileWriter {
virtual ~IndentWriter() {}
// etc.
};
class CSVWriter : FileWriter {
virtual ~CSVWriter() {}
// etc.
};
std::unordered_map<FileFormat, std::function<std::unique_ptr<FileWriter>()>> formatMap {
{ Indent, []() { return std::unique_ptr<FileWriter>(new IndentWriter); } },
{ CSV, []() { return std::unique_ptr<FileWriter>(new CSVWriter); } }
};
FileType type = // obtain type ID however you want
auto objPtr = formatMap[type]();