【问题标题】:Call constructor of member object调用成员对象的构造函数
【发布时间】:2019-08-07 21:49:15
【问题描述】:

我尝试实现 amySQL,并且我想初始化这个连接器介绍测试功能。

class Foo
{
public:
    void Test();

protected:
    amy::connector mgr;

private:
    asio::io_service m;
};

void Foo::Test()
{
    mgr(m);
}

但是当我想编译时,我得到了这个错误:

error: no match for call to '(amy::connector {aka amy::basic_connector<amy::mysql_service>}) (asio::io_service&)'
  mgr(m);

我在这里做错了什么? 存储库到 amy sql https://github.com/liancheng/amy

【问题讨论】:

  • 你不会“初始化构造函数”——构造函数会初始化事物。
  • 如果您使用的是boost::asio,并且您有一个相对较新的boost版本,请使用io_context而不是io_serviceio_service 只是一个用于向后兼容的 typedef。
  • C++ Constructor的可能重复

标签: c++


【解决方案1】:

您需要在Foo 类构造函数中初始化mgr 成员,而不是在Test() 类方法中:

class Foo
{
public:
    Foo();
    void Test();

private:
    asio::io_service m;

protected:
    amy::connector mgr;
};

Foo::Foo() : mgr(m) // <-- initialize here!
{
}

void Foo::Test()
{
    // use mgr here as needed...
}

【讨论】:

  • @TedLyngmo 是的,应该
  • mgr 之前声明m 非常微妙,但在这里至关重要,因为成员是按声明顺序初始化的。如果mmgr 之后声明,那么初始化器mgr(m) 将使用一个未初始化的对象并且几乎肯定会导致未定义的行为。
  • @alterigel 惊人的答案,你救了我。我想知道为什么我要开始核心崩溃,这是不可能找到的。似乎这就是原因,声明的顺序与初始化的顺序不同。 xD
【解决方案2】:

您可以在类构造函数的初始化列表中初始化成员

Foo::Foo() : mgr(m) {}

【讨论】:

  • 类名是Foo,而不是TestTest()Foo 类的方法
猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 2012-08-15
  • 2017-02-02
  • 2011-12-07
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
相关资源
最近更新 更多