如何初始化具有私有对象成员的对象,该构造函数将非常量引用作为参数
How to initialize an object with private object member which constructor eat non-const reference as a parameter
我问过这个问题,但我仍然无法解决我的项目中的问题。
我的项目使用第三方库,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
- 代理对象的常量正确性
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 如何使用数据对象上的常量指针初始化类
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 为什么当我们有常量引用时创建临时对象?
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- C++,如何使用常量对象和非常量对象进行比较?
- 通过从构造函数中的'this'复制的指针改变常量对象
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- C++将常量字符* 指针数组传递给对象
- C++ 对非常量对象的常量引用和对非常量对象的非常量引用之间的区别
- 未定义的对象(〔basic.life〕/8):为什么允许引用重新绑定(和常量修改)
- 当类具有常量时,将对象插入到向量中
- 算法不适用于非常量对象的const_iterator
- C++:允许临时对象调用非常量成员函数的设计理念是什么?
- 为什么MSVC14允许声明指向动态未初始化常量对象的指针
- 可作为常量调用的比较对象
- C++中的常量对象或私有/常量数据成员(变量)?
- 将值从指针复制到常量对象参数
- 如何正确组合可变对象常量