【发布时间】:2013-09-11 16:13:38
【问题描述】:
我正在用 C++ 编写一个玩具正则表达式引擎作为学习练习,但我遇到了编译器错误。下面是实现不同表达式子类型的类的定义:
// ***************************************************************
// ***************************************************************
class RegexExpression {
public:
virtual RegexResult match(std::string);
};
// ***************************************************************
class RegexTerm : public virtual RegexExpression {
public:
RegexTerm(char c) : _matchChar(c) {}
RegexResult match(std::string);
private:
char _matchChar;
};
// ***************************************************************
class RegexNil : public virtual RegexExpression {
public:
RegexResult match(std::string);
};
// ***************************************************************
// ***************************************************************
class RegexBinaryExpression : public virtual RegexExpression {
public:
RegexBinaryExpression
(RegexExpression &lhs, RegexExpression &rhs) :
_lhs(lhs), _rhs(rhs) {}
protected:
RegexExpression _lhs;
RegexExpression _rhs;
};
// ***************************************************************
class RegexOr : public RegexBinaryExpression {
public:
RegexResult match(std::string);
};
// ***************************************************************
class RegexAnd : public RegexBinaryExpression {
public:
RegexResult match(std::string);
};
但是当我尝试实例化 RegexOr 时,例如:
RegexOr regex(RegexTerm('a'), RegexNil());
然后我收到一个编译器错误,告诉我 RegexBinaryExpression 的 2 参数构造函数不可见。
如果我在RegexOr中显式定义了构造函数,例如:
RegexOr(RegexExpression &l, RegexExpression &r) : RegexBinaryExpression(l, r) {}
然后我被告知 RegexNil 不能转换为 RegexExpression。
我在这里做错了什么?
【问题讨论】:
-
只是一个观察。 Regex 代表 RegularExpression,因此您的类名似乎是多余的:RegularExpressionExpression。这只是一个练习,所以我想这并不重要,但这会让我发疯:D
-
究竟是什么错误? “来自 RegexBinaryExpression 的 2 个参数构造函数不可见。” ???
-
您还应该在基类中放置一个虚拟析构函数。
-
@crush - 我知道。我发帖后就注意到了。
-
确切的错误是
no matching function for call to ‘Regex::RegexOr::RegexOr(Regex::RegexExpression&, Regex::RegexNil)
标签: c++ oop inheritance virtual-functions