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 ++如何将类初始化器用于非默认构造的类的主要内容,如果未能解决你的问题,请参考以下文章

如何使用CString参考调用非托管C ++ DLL

具有引用数据成员的类的默认构造函数?

如何在c ++中的类构造函数中将整个数组初始化为单个元素

在构造函数代码之前禁用默认类成员初始化

如何从 Groovy 构造一个(非静态)Java 内部类

函数返回迭代器以构造 STL 容器