Как инициализировать объект с закрытым членом объекта, конструктор которого использует неконстантную ссылку в качестве параметра

Я спрашиваю этот вопрос, и я до сих пор не могу решить проблему с моим проектом.

Мой проект использует стороннюю библиотеку, Клиент Hazelcast C ++.

Использование 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;
}

Этот код не проблема. Больше примеров можно получить на своем сайте. Однако, если я хочу сделать HazelcastClient hz как частный участник класса, я понятия не имею, чтобы создать экземпляр моего класса !!

Я проверил HazelcastClient конструктор в Заголовок HazelcastClient.h, использование конструктора ClientConfig &config в качестве параметра, который позволяет следующему коду вызвать ошибку вроде:

HzService.cpp: ошибка: невозможно связать неконстантную ссылку lvalue типа ‘hazelcast :: 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 ++ во-первых, и используйте следующую команду для компиляции (содержимое 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

0

Решение

Вместо этого объявите 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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]