如何使用构造函数将 non-const 引用作为参数的私有 object 成员初始化 object
How to initialize an object with private object member which constructor eat non-const reference as a parameter
我已经问了this question,我的项目还是没能解决问题
我的项目使用 third-party 库,Hazelcast C++ Client。
Hazelcast Client的使用是这样的:
#include "hazelcast/client/HazelcastAll.h"
using namespace hazelcast::client;
int main(){
ClientConfig clientConfig;
Address address("192.168.85.34", 5701);
clientConfig.getNetworkConfig().addAddress(address);
HazelcastClient hz(clientConfig);
// do something...
hz.shutdown();
return 0;
}
这段代码没有问题。可以获得更多示例in its website。但是,如果我想让 HazelcastClient hz
成为 class 私有成员,我不知道要实例化我的 class !!
我检查了HazelcastClient.h header中的HazelcastClient
构造函数,构造函数使用ClientConfig &config
作为参数,这让下面的代码导致错误,如:
HzService.cpp: error: cannot bind non-const lvalue reference of type ‘hazelcast::client::ClientConfig&’ to an rvalue of type ‘hazelcast::client::ClientConfig’
因为编译信息有14282行,这里贴的太多了,所以只贴了一个重要的错误在上面!
完整编译讯息可下载here.
#include "hazelcast/client/HazelcastAll.h"
using namespace hazelcast::client;
class HzService {
public:
HzService();
virtual ~HzService();
private:
// Variables:
HazelcastClient hz_client;
// Functions:
ClientConfig createLocalConfig();
};
HzService::HzService()
:hz_client(createLocalConfig()){
}
HzService::~HzService() {
hz_client.shutdown();
}
ClientConfig HzService::createLocalConfig() {
ClientConfig clientConfig;
Address address("192.168.85.34", 5701);
clientConfig.getNetworkConfig().addAddress(address);
return clientConfig;
}
int main () {
HzService hs;
return 0;
}
也许这不是 Hazelcast 的问题,但问题是如果我使用 third-party 库,它的 class 构造函数使用 non-const 引用作为参数,我怎样才能把它变成我的 class 私有成员?
如果问题与 Hazelcast 具体相关,我会更改标题。
编辑:
如果有人需要测试代码,请先下载Hazelcast C++ Client,然后使用以下命令编译(test.cpp的内容就是上面的代码):
g++ -std=c++11 \
-I/path/to/hazelcast-cpp-client/hazelcast/include \
-I/path/to/hazelcast-cpp-client/external/include/ \
-I/path/to/hazelcast-cpp-client/hazelcast/generated-sources/include \
test.cpp \
/path/to/hazelcast-cpp-client/release/libHazelcastClient3.11_64.a \
-lpthread
改为将 hz_client 声明为指针。
也将 ClientConfig 声明为指针
在 HzService() 中首先创建 clientconfig 实例,然后创建 hz_client 将 clientconfig 实例传递给它。
例如
class HzService
{
...
HazelcastClient* hz = nullptr; // but better with smart pointer and custom deleter.
std::unique_ptr<ClientConfig> cc;
...
HzService()
{
cc = std::make_unique<ClientConfig>();
Address address("192.168.85.34", 5701);
cc->getNetworkConfig().addAddress(address);
hz_client = new HazelcastClient(*cc.get());
}
然后在析构函数中添加一些代码来执行关闭和删除hz_client
我已经问了this question,我的项目还是没能解决问题
我的项目使用 third-party 库,Hazelcast C++ Client。
Hazelcast Client的使用是这样的:
#include "hazelcast/client/HazelcastAll.h"
using namespace hazelcast::client;
int main(){
ClientConfig clientConfig;
Address address("192.168.85.34", 5701);
clientConfig.getNetworkConfig().addAddress(address);
HazelcastClient hz(clientConfig);
// do something...
hz.shutdown();
return 0;
}
这段代码没有问题。可以获得更多示例in its website。但是,如果我想让 HazelcastClient hz
成为 class 私有成员,我不知道要实例化我的 class !!
我检查了HazelcastClient.h header中的HazelcastClient
构造函数,构造函数使用ClientConfig &config
作为参数,这让下面的代码导致错误,如:
HzService.cpp: error: cannot bind non-const lvalue reference of type ‘hazelcast::client::ClientConfig&’ to an rvalue of type ‘hazelcast::client::ClientConfig’
因为编译信息有14282行,这里贴的太多了,所以只贴了一个重要的错误在上面! 完整编译讯息可下载here.
#include "hazelcast/client/HazelcastAll.h"
using namespace hazelcast::client;
class HzService {
public:
HzService();
virtual ~HzService();
private:
// Variables:
HazelcastClient hz_client;
// Functions:
ClientConfig createLocalConfig();
};
HzService::HzService()
:hz_client(createLocalConfig()){
}
HzService::~HzService() {
hz_client.shutdown();
}
ClientConfig HzService::createLocalConfig() {
ClientConfig clientConfig;
Address address("192.168.85.34", 5701);
clientConfig.getNetworkConfig().addAddress(address);
return clientConfig;
}
int main () {
HzService hs;
return 0;
}
也许这不是 Hazelcast 的问题,但问题是如果我使用 third-party 库,它的 class 构造函数使用 non-const 引用作为参数,我怎样才能把它变成我的 class 私有成员?
如果问题与 Hazelcast 具体相关,我会更改标题。
编辑:
如果有人需要测试代码,请先下载Hazelcast C++ Client,然后使用以下命令编译(test.cpp的内容就是上面的代码):
g++ -std=c++11 \
-I/path/to/hazelcast-cpp-client/hazelcast/include \
-I/path/to/hazelcast-cpp-client/external/include/ \
-I/path/to/hazelcast-cpp-client/hazelcast/generated-sources/include \
test.cpp \
/path/to/hazelcast-cpp-client/release/libHazelcastClient3.11_64.a \
-lpthread
改为将 hz_client 声明为指针。
也将 ClientConfig 声明为指针
在 HzService() 中首先创建 clientconfig 实例,然后创建 hz_client 将 clientconfig 实例传递给它。
例如
class HzService
{
...
HazelcastClient* hz = nullptr; // but better with smart pointer and custom deleter.
std::unique_ptr<ClientConfig> cc;
...
HzService()
{
cc = std::make_unique<ClientConfig>();
Address address("192.168.85.34", 5701);
cc->getNetworkConfig().addAddress(address);
hz_client = new HazelcastClient(*cc.get());
}
然后在析构函数中添加一些代码来执行关闭和删除hz_client