声明变量,IF和SWITCH状态。好的做法

时间:2014-12-25 19:33:55

标签: c++

CIndent和CCSV有相同的父类,这就是我在printFile中传递的,使用If或SWITCH声明变量这个好主意吗?

if (fileFormat==1)
    CIndent codecWrite;
else
    CCSV codecWrite;

route.prinFile(filename,codecWrite);

你还有其他方法吗?为什么?怎么样 ?

3 个答案:

答案 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

有人曾经问过Ken Thompson,如果他再次设计Unix,他会做些什么,并回答:“我用 e 拼写 creat !”

答案 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]();