gpt4 book ai didi

C++接口(interface)设计问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:56 25 4
gpt4 key购买 nike

我正在编写一个解析器并且我有以下接口(interface):

class IStatement
{
// Represents instructions like "HelloWorld();"
// Or flow control blocks like : "if( foo ) { bar(); }", "return 0;" etc...
public:
virtual void execute( CScope & ) const = 0;
};

以及以下类:

class CGoto : public IStatement // Basically a sequence of IStatement sub classes.
{
protected:
vector<IStatement *>
public:
virtual void execute( CScope & ) const; // Executes all statements.
};

class CConditional : public CGoto
{
protected:
CExpression // Condition that must be true
public:
virtual void execute( CScope & ) const; // If expression is true, executes all statements (i.e call CGoto::execute()).
};

我的问题是我想创建一个 CIf 类:

class CIf : public CConditional // Repesents a whole if/else if/ else block.
{
// "this" is the "if" part of the if/else if/else block

vector<CConditional *> _apoElseIfs; // "else if" parts, if any.

CConditional * _poElse; // NULL if no "else" in if/else if/else block.

public:

virtual void execute( CScope & roScope ) const
{
// HERE is my problem !
// If the condition in the "if" part is true, i'm not going to execute
// the else if's or the else.
// The problem is that i have no idea from here if i should return because the
// if was executed, or if i should continue to the else if's and the else.

CConditional::execute( roScope );

// Was the condition of the "if" true ? (i.e return at this point)

// For each else if
{
current else if -> execute( roScope );
// Was the condition of the current "else if" true ? (i.e return at this point)
}

else -> execute( roScope );
}
};

我不知道在我执行“if”或“else if”之后我是应该继续还是返回。

我想我可以使用一个 bool 值作为方法 execute() 的返回值,它会指示语句是否已执行,但这对于非条件的 IStatement 实现没有意义。

我也可以让类 CConditional 不测试条件本身,这样 CConditional::execute() 就不管条件如何都执行语句,并且无论什么操作类都会自己做,但是我想将该测试封装在 CConditional::execute() 方法中。

我希望我能尽可能清楚地解释我的问题。你知道我怎样才能干净利落地做到这一点吗?

谢谢你:)

最佳答案

您的设计似乎有点困惑。

我会做一个 Block 类,代表一个 { sttmnt1 , sttmnt2 , sttmntN } .

class Block : public IStatement
{
std::vector<IStatement*> statements;
public:
virtual void execute( CScope & ) const { /* executes list of statements */ }
};

这样你总是可以使用 if 单语句,并且可以使用 Block处理多个语句的类。

还有一个 Expression 类,用于可以计算的语句,例如 2 < x .

class IExpression : public IStatement
{
public:
virtual Value evaluate(CScope &scope) const = 0;
virtual void execute( CScope &scope ) const { evaluate(scope); }
}

您需要一个 Value表示表达式结果的类。

最后,If 类的属性是一个表达式,一个语句 表示if else 的一部分和另一个(可选)部分。

class If: public IStatement
{
IExpression *condition;
IStatement *ifPart;
IStatement *elsePart;

public:
virtual void execute( CScope &scope ) const {
if (condition->evaluate().asBoolValue()) {
ifPart->execute(scope);
}
else if (elsePart) {
elsePart->execute(scope);
}
}
}

处理else if在这种情况下,您只需要设置一个新的 If对象作为 else第一部分。

关于C++接口(interface)设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21913830/

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