c++ - 混合 C++ 类继承和初始化列表。我心中的未解之谜

标签 c++ derived-class initializer-list

我有4个类(class)

class A { //a base class
    public:
    A(ostringstream* os){ oss2=os; }
    ostringstream* oss2;
};

class B : public A{ // a derived class 
    public:
    B(ostringstream* os):A(os){};
};

class C { //class where oss is actually declared
    public:
    C(){};
    ostringstream oss;
};

最后(踢球者):“C”的派生类,需要传递对 oss 的引用。

class D : public C{
    public:
    B b(&oss);
};

B b(&oss); 行中我得到了错误

error: expected identifier before ‘&’ token

老实说,我不知道我在这里是不是在玩火。基本思想是我希望 A 的一些函数写入一个公共(public)输出流。

这不是一个日志记录类,但我看到一些记录器声明了一个静态 oss 变量并允许每个人在那里写。我宁愿避免这种情况,并在(逻辑上)正确的位置实例化我的 oss。就我而言,那是在 C 类中。

我认为(但我可能是错的)这里的错误是我试图通过 B b 的声明提供对变量 (oss) 的引用。是对的吗?相反,应该使用初始化列表来为构造函数提供值。但我不确定如何实现它(并测试它是否编译)。

最佳答案

如果你想在 D 中有一个 B 类型的字段,你应该在那里声明它并在构造函数中初始化它,正如你已经暗示的那样:

class D : public C{
  public:
    D() : 
      C(),    // You can leave this out, the compiler will do it for you
      b(&oss) // Once the C part is constructed you can pass in its field.
    {}

  private: // ?
    B b;
};

但是根据你的情况,在设计上可能会有更好的解决方案。例如,如果 C 是输出的基类,而 A 是需要进行一些日志记录的类,您可以采用如下解决方案:

class A { // worker base class
    public:
        A(C* logger) : logger(logger) {}
    private:
        C* logger;
};

class B : public A{ // a derived class 
    public:
        B(C* logger) : A(logger) {};
};

class C { // logging class
    public:
        C(){};  
        virtual ~C() {};
        virtual void Log(const std::string& message) = 0;
};

class D : public C { // a derived class
  public:
      D() {} 
      virtual void Log(const std::string& message) 
      {
        this->oss << message;
      }
  private:
      ostringstream oss;
}

// In main:
D streamLogger;
A worker(&streamLogger);

现在 A 不关心它输出到什么,只需将一个支持 Log 消息的类传递给它,让多态性处理其余部分。事实上,如果您想要一个发送电子邮件的日志记录方法,只需创建一个新的 C 派生并将其传递到相同的 A 实例即可。

关于c++ - 混合 C++ 类继承和初始化列表。我心中的未解之谜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34293092/

相关文章:

c++ - 使用来自抽象基类 C++ 的变量的派生类

C# 派生类,重载解析

c++ - 初始化列表与 vector

c++ - 保留 std::initializer_list 的拷贝是否安全?这是什么道理?

c++ - 如何使用 Eigen 库定义动态矩阵?

c++ - 不太确定如何从这里继续前进。使用链表搜索?

Python:在基类的方法中初始化一个新的派生类

c++ - 如何实现decltype功能-C++ 11之前的编译时间

c++ - C++ 20中协程的机制是什么?

c++ - 使用一个函数调用 C++ 初始化多个常量类成员