我正试图利用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&
或所选的智能指针(。
无论如何,这样初始化所有成员是一个很好的做法,因为这样可以避免创建具有默认值的成员并在主体中赋值。