C++处理层次结构中两个类之间状态的问题

tjvv9vkg  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(95)

问题描述

考虑下面的类层次结构。具体模板类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,但在外部保存,但这变得越来越丑陋和复杂。

我肯定漏掉了什么。

xqnpmsa8

xqnpmsa81#

下面的代码满足您的要求。您可以将m_isInteresting放在C类中,并将其标记为protected,以便子类能够访问它。然后可以在子类中将其称为this->m_isInteresting

#include "optional"

class C {
protected:
    bool m_isInteresting = false;
public:
    virtual void bar() = 0;
};

template <typename T>
class B: public C {
public:
    virtual std::optional<T> foo() = 0;
};

template <typename T>
class A: public B<T> {
public:
    std::optional<T> foo() override {
        this->m_isInteresting = true;
        return {};
    }
    void bar() override {
        this->m_isInteresting = false;
    }
};

字符串

相关问题