C++在构造函数中分配对属性的引用

C++在构造函数中分配对属性的引用

问题描述:

我需要将数据库连接传递给新的对象实例。但是,下面的代码不按想要的那样工作。C++在构造函数中分配对属性的引用

class child { 
    public: 
    db_connection Con; 
    child(db_connection& Con); 
}; 

child::child(db_connection& Con) { 
    this->Con = Con; 
} 

在构造函数中的赋值引发此错误:使用删除功能....

我知道这意味着它调用db_connection的构造函数来创建精读的新对象。但那不是我想要的。

我不能在声明类声明的属性“精读”作为

class child { 
    public: 
    db_connection& Con; 
    ... 

因为引用必须初始化或分配。这是一个困难的情况。

如您所述,为了能够使用参考,您需要初始化它。对于您应该使用构造函数初始化列表

class child { 
    db_connection& Con; 

    public: 
    child(db_connection& con) : Con(con) 
    {} 
    ... 
}; 

初始化成员变量,而不是在构造函数中分配给它。

+0

如何通过2个或更多变量? :CON(CON),VAR(VAR),...? – johnlowvale

+0

哦,我发现它,逗号分隔 – johnlowvale

+0

它仍然是“使用删除的函数...”:错误:使用删除的函数'mongocxx :: v_noabi :: client :: client(const mongocxx :: v_noabi :: client&)' Db_Client(Db_Client _),Request(Request _),Response(Response_) – johnlowvale

如果child被允许采取传递给它的建筑连接实例的所有权,那么你可以使用一个转移构造

child(db_connection&& Con_) : Con(std::move(Con_)){}

其消除的值复制一个悬而未决的参考的潜力。这使传递给构造函数的Con_无效。

+0

是的,传入的变量是公开的 – johnlowvale

+0

在这种情况下,这个答案就像独木舟的陷阱门一样有用。我会留下它,因为它可能在其他情况下有用。 – Bathsheba

+0

这个事实很可怕:“这会使传递给构造函数的Con_无效。”变量的原始拥有者不能再使用这个变量了吗?似乎无法将同一个Con_传递给第二个孩子 – johnlowvale