std::unique_ptr是否在Factory类中保存引用



我正试图利用ConnectionPoolFactory(我们称之为工厂a(,该工厂创建一个std::unique_ptr<cpool::ConnectionPool>。。我知道这个唯一的指针不能被复制(否则它就不会保持唯一(。。

但是我如何将这个引用传递给另一个工厂(我们称之为工厂B(以供使用?

编译时发生的错误

thrift_server.cpp: In constructor ‘thriftserverHandlerFactory::thriftserverHandlerFactory(const char*, int, const std::unique_ptr<cpool::ConnectionPool>&)’:
thrift_server.cpp:237:27: error: cannot convert ‘const std::unique_ptr<cpool::ConnectionPool>’ to ‘cpool::ConnectionPool*’ in assignment
237 |       this->tma_conn_pool=conn_pool;
|                           ^~~~~~~~~
|                           |
|                           const std::unique_ptr<cpool::ConnectionPool>

工厂B-这是一个Apache Thrift服务器处理程序工厂。。。当客户端连接到此旧服务器时。。它们应该共享相同的连接池,并且如果所有连接都很忙。。我们将暂停或超时新的连接

class thriftserverHandlerFactory : public thriftserverIfFactory {
public:
ibrokersHandlerFactory(const char* target_thriftserver_host, int target_thriftserver_port, const std::unique_ptr<cpool::ConnectionPool> & conn_pool) {
this->handler_num=0;
this->tma_conn_pool=conn_pool;
}
...
private:
unsigned int handler_num;
cpool::ConnectionPool* tma_conn_pool;
};

工厂A

template <>
class cpool::ConnectionPoolFactory<TMAConnection> {
public:
static std::unique_ptr<cpool::ConnectionPool> create( const std::uint16_t num_connections ) {
std::vector< std::unique_ptr<cpool::Connection> > connections;
for ( std::uint16_t k = 0; k < num_connections; ++k ) {
// cannot use std::make_unique, because constructor is hidden
connections.emplace_back( std::unique_ptr<TMAConnection>( new TMAConnection{} ) );
}
return std::unique_ptr<cpool::ConnectionPool>( new cpool::ConnectionPool{std::move( connections )} );
}
};

智能指针sharing问题您已经知道了,因此请关注如何传递和分配引用问题。

出了什么问题

在初始化期间,引用变量(const声明的变量(只能赋值一次。如果类型匹配,编译器会抱怨这一点。

如何修复

标准变量可以像一样立即实例化和分配

int a = 0;
int& b = a;

对于类/结构,它的工作方式略有不同。与其在构造函数体中赋值,不如在:之后的初始值设定项列表中执行此操作

class a {
int& ref;
a (int& b)
: ref{b} {}
};

在您的示例中,它看起来像这样:

class thriftserverHandlerFactory : public thriftserverIfFactory {
public:
ibrokersHandlerFactory(const char* target_thriftserver_host, int target_thriftserver_port, const cpool::ConnectionPool& conn_pool) 
: handler_num{0}, 
tma_conn_pool {conn_pool}
{}
private:
unsigned int handler_num;
const cpool::ConnectionPool& tma_conn_pool;
};

我不确定您想要的确切类型,因为构造函数和成员不匹配(由于实验原因猜测(,所以在我的示例中使用了cpool::ConnectionPool&。您可能希望将tma_conn_pool修改为匹配的类型(例如cpool::ConnectionPool&或所选的智能指针(。

无论如何,这样初始化所有成员是一个很好的做法,因为这样可以避免创建具有默认值的成员并在主体中赋值。

最新更新