如何在 C++ 的外部类构造函数中初始化嵌套类成员
Posted
技术标签:
【中文标题】如何在 C++ 的外部类构造函数中初始化嵌套类成员【英文标题】:How to initalize nested class members in outer class constructor in C++ 【发布时间】:2020-06-22 08:53:31 【问题描述】:我有一个 C++ 程序,它有一个如下所示的嵌套类
class Outer
Outer(int val);
private:
class Inner;
std::unique_ptr<Inner> obj;
;
Outer::Outer(int val):obj(Inner::CreateInstance(val))
我的内部类在另一个文件中,并且有一个私有字符串变量 mystring,如图所示
class Inner
public:
Inner(int val):mVal(val), mystring("")
static std::unique_ptr<Inner> CreateInstance(int val)
// returns Inner unique ptr
private:
int mVal
string mystring;
;
这里的 mVal 和 mystring 已经在 Inner 类构造函数中初始化了。但是我得到了这个 MISRA 错误,说 mystring 没有在外部构造函数中初始化。
如何从外部构造函数初始化 mystring? 即使 Inner 类初始化了 mystring 那么为什么会出现这种错误。
【问题讨论】:
你真的可以在 MISRA-C++ 中使用智能指针/动态分配吗?我非常怀疑这一点。我也怀疑你是否可以使用 C++03 以外的任何东西。 是的,我们有。 MISRA 错误位于我的代码所基于的 C++11/14 之上。 来自official source:“该文档被称为在关键系统中使用 C++ 语言的 MISRA C++ 指南,于 2008 年 6 月 5 日发布并正式发布。” i> 那里没有提到更高版本。因此,当 MISRA C++ 指南发布时,它们不可能包括 C++11 及更高版本。因此,无论如何使用 C++11/14 可能会破坏我们对 MISRA 使用的信任(因为该指南仅针对以前的 C++ 版本编写)。 用于生成上述错误的工具还包括 Autosar 指南和 MISRA。我的错。 但是,如何从外部构造函数初始化 mystring? 【参考方案1】:你试过这个吗?您不需要在 Outer 类中进行前向声明。 我假设只需翻转这些课程。
class Inner
public:
Inner(int val):mVal(val), mystring("")
static std::unique_ptr<Inner> CreateInstance(int val)
// returns Inner unique ptr
/* I am using an arbitrary integer as an example */
return std::make_unique<Inner>(10);
private:
int mVal;
std::string mystring;
;
class Outer
Outer(int val);
private:
std::unique_ptr<Inner> obj;
;
Outer::Outer(int val):obj(Inner::CreateInstance(val))
【讨论】:
以上是关于如何在 C++ 的外部类构造函数中初始化嵌套类成员的主要内容,如果未能解决你的问题,请参考以下文章
C++中如何在子类的构造函数中调用基类的构造函数来初始化基类成员变量
C ++:如何在派生类中定义基类构造函数,如果基构造函数具有带有私有成员的初始化列表[重复]