如何初始化具有私有对象成员的对象,该构造函数将非常量引用作为参数

How to initialize an object with private object member which constructor eat non-const reference as a parameter

本文关键字:对象 常量 非常 参数 引用 构造函数 初始化 成员      更新时间:2023-10-16

我问过这个问题,但我仍然无法解决我的项目中的问题。

我的项目使用第三方库,HazelcastC++客户端

Hazelcast客户端的使用类似于:

#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;
}

这个代码没有问题。更多的例子可以在它的网站上找到。然而,如果我想使HazelcastClient hz成为类私有成员,我不知道实例化我的类!!

我已经在HazelcastClient.h头中检查了HazelcastClient构造函数,该构造函数使用ClientConfig &config作为参数,这使得以下代码导致错误,如:

HzService.cpp:错误:无法绑定类型为'hazecast::client::ClientConfig&'的非常量左值引用转换为'hazelcast::client::ClientConfig'类型的右值

这是因为编译消息有14282行,太多了,无法粘贴在这里,所以我只是粘贴了上面的一个重要错误!完整的编译消息可以在这里下载。

#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的问题,但问题是,如果我使用第三方库,其类构造函数使用非常量引用作为参数,我如何将其作为类私有成员?

如果问题特别与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