【问题标题】:How to initalize nested class members in outer class constructor in C++如何在 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?

标签: c++ c++11 coding-style c++14 misra


【解决方案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))
{

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多