【问题标题】:Initialize member in class constructor and pass member down to base class at the same time在类构造函数中初始化成员,同时将成员传递给基类
【发布时间】:2021-12-19 17:20:55
【问题描述】:

我有一个从 MyBase 派生的主类 (MyClass)。此外,我还有一个从 HelperBase(由 MyBase 使用)派生的 Helper 类(由 MyClass 使用)。有没有办法在 MyClass 的构造函数初始化中初始化 Helper 并将助手传递给 MyBase ,它将 HelperBase 作为构造函数参数? 如下:

编辑:忘记从 HelperBase 派生 Helper(如 cmets 中所述)修复了示例代码中的问题

//-------------------------------------------
// HelperBase.h
class MyBase;

// HelperBase holds a ref to MyBase
class HelperBase {
public:
    HelperBase(MyBase& i_ParentBase);

protected:
    MyBase& m_ParentBase;
};
// HelperBase.cpp
HelperBase::HelperBase(MyBase& i_ParentBase)
    : m_ParentBase(i_ParentBase)
{}
//-------------------------------------------
// Helper.h
class MyClass;

// Helper holds a ref to MyClass
class Helper : public HelperBase{
public:
    Helper(MyClass& i_Parent);

protected:
    MyClass& m_Parent;
};
//-------------------------------------------
// MyBase.h
// MyBase holds a ref to HelperBase
class MyBase {
public:
    MyBase(HelperBase& i_HelperBase);

protected:
    HelperBase& m_HelperBase;
};
// MyBase.cpp
MyBase::MyBase(HelperBase& i_HelperBase) : m_HelperBase(i_HelperBase)
{}
//-------------------------------------------
// MyClass.h
// MyClass holds and initializes an instance of Helper
class MyClass : public MyBase
{
public:
    MyClass();

protected:
    Helper m_Helper;
};
// MyClass.cpp
MyClass::MyClass()
    : MyBase(m_Helper), // <-- this is the problem !!!
    m_Helper(*this)
{}
//-------------------------------------------
// Helper.cpp
Helper::Helper(MyClass& i_Parent)
    : HelperBase(i_Parent),
      m_Parent(i_Parent)
{}
//-------------------------------------------

【问题讨论】:

  • 您是否忘记从HelperBase 派生Helper?然后,在Helper 构造函数中,您将需要: HelperBase(i_Parent),并且构造函数本身需要下移到MyClass 的定义之下。
  • @HolyBlackCat,显然你是完全正确的。我现在修好了。
  • 请创建一个回答帖子。

标签: c++ inheritance constructor-injection member-initialization


【解决方案1】:

最后结果证明代码如上所示。有一个隐藏的/不那么明显的命名约定冲突,导致事情没有按预期编译(编译错误乍一看并没有显示出来)。很抱歉。

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    相关资源
    最近更新 更多