如何使用构造函数将 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