c ++如何将类初始化器用于非默认构造的类
Posted
技术标签:
【中文标题】c ++如何将类初始化器用于非默认构造的类【英文标题】:c++ how to use class initialiser for a non default constructed class 【发布时间】:2021-12-13 14:35:00 【问题描述】:我开始在 VS2019 (c++17) 中使用 SonarLint
我不知道如何为非默认构造的类使用类内初始化程序
class Foo
public:
Foo(const std::string& str);
private:
const std::string m_foostr;
;
Foo::Foo(const std::string& str) :
m_foostr(str)
现在这里会弹出 sonarlint 警告
class Bar
private:
Foo m_foo;
;
Bar::Bar() : m_foo("something) ///< this produces a warning
Sonarlint 告诉我在类初始化器中使用 https://rules.sonarsource.com/cpp/RSPEC-3230
如何实现这一目标? 我已经试过了
m_foo = Foo("something");
和
m_foo(Foo("something"));
两者都会导致编译器错误(可能是因为 m_foostr 是 const)。
你能帮帮我吗? 谢谢
编辑:根据要求:编译器错误是
第一个结果
Error C2280: attempting-to-reference-a-deleted-function
第二个结果
Error 2064 term does not evaluate to a function taking N arguments
【问题讨论】:
both result in a compiler error
。请在帖子本身中包含给定的编译错误。在比较和查找问题的原因时,它很有帮助。
Default member initializer?: Demo on coliru
如果您希望我们查看警告或错误,您需要将它们包含在问题中。
您不能使用括号来初始化类内初始化上下文中的成员,您需要使用花括号/列表初始化或等号。另外,您使用的是什么编译器?我是unable to reproduce the compiler error either on GCC or on Clang。
@JHeni 您在Bar
的声明中缺少构造函数的声明。如果这实际上是您正在使用的代码,那么添加该声明应该可以解决问题,不需要默认成员初始化程序。
【参考方案1】:
您尚未声明默认构造函数。如果没有声明,您正在编写定义,这就是您遇到第一个错误的原因。
class Bar
public:
Bar();
private:
Foo m_foo;
;
Bar::Bar() : m_foo("something") ///< this produces a warning
【讨论】:
以上是关于c ++如何将类初始化器用于非默认构造的类的主要内容,如果未能解决你的问题,请参考以下文章