问题描述
考虑下面的类层次结构。具体模板类A,模板抽象类B和接口C,A <-- B <-- C
。考虑B有一个函数声明
virtual std::optional<T> foo() const = 0;
字符串
c有一个函数声明
virtual bar() = 0;
型
两者都在A中适当地定义。
在代码中的某个地方存在一个对象B的列表,我们称之为foo()
,并且存在一个C* 指针的列表,我们称之为bar()
。
举一个简单的例子:
示例和我的问题
class A <typename T> : public B <T>
{
public:
std::optional<T> foo() const override { /*...*/ };
bar() override { /*...*/ };
// ...
};
class B <typename T> : public C
{
public:
virtual std::optional<T> foo() const = 0;
// ...
}
class C
{
public:
virtual bar() = 0;
}
型
我遇到的问题是,我想在这个小层次结构上添加一个布尔状态。我特别有以下要求
1.我需要一个布尔状态m_isInteresting
在这个层次结构所代表的对象。
1.我不希望m_isInteresting
将其声明为A(出于解耦原因)。
1.我想让foo()
设置m_isInteresting = true;
。
1.我想让bar()
设置m_isInteresting = false;
。
我该如何实现这一点?
Things I have tried
- 我试图用
m_isInteresting
成员和适当的访问器创建一个围绕C的装饰器 Package 器,并使用bar()
的方法,在该方法中,我调用C的bar()
函数并将类成员m_isInteresting
设置为false,但由于foo()
位于类层次结构的下游,因此无法将该成员设置为true。 - 我试图将
foo()
的声明移到C中(同时保留它在A中的定义),但这非常困难,因为该函数返回std::optional<T>
,而且C没有模板化;派生类的函数签名必须与基类的签名匹配。 - 我曾想过为B和C创建装饰器类,它们之间共享
m_isInteresting
,但在外部保存,但这变得越来越丑陋和复杂。
我肯定漏掉了什么。
1条答案
按热度按时间xqnpmsa81#
下面的代码满足您的要求。您可以将
m_isInteresting
放在C
类中,并将其标记为protected,以便子类能够访问它。然后可以在子类中将其称为this->m_isInteresting
。字符串