IAdapter* adapter = nullptr;
AdapterTwo at;
adapter = IAdapter::CreateList(IAdapter::AdapterTwovalue);
Вы создали два независимых объекта здесь (как при вызове new
в createList
): at
, а один adapter
указывает на.
AdapterTwo at;
at.SetClientbroker("amqp");
Теперь, конечно, вы получите ожидаемый результат, если вы позволите adapter
указать на at
, но как может другой объект знать о строке, которую вы установили в первом?
adapter = IAdapter::CreateList(IAdapter::AdapterTwovalue);
adapter->SetClientbroker("amqp"); // (*) !!!
Вам также нужно установить посредника на другой объект.Будучи различными объектами, вы даже можете установить брокеров независимо:
AdapterTwo at;
at.SetClientbroker("amqp");
IAdapter* adapter = IAdapter::CreateList(IAdapter::AdapterTwovalue);
adapter->SetClientbroker("aconcagua"); // (*) !!!
Вывод теперь будет (если вы вызывали connect
для обоих объектов):
final value=amqp
final value=aconcagua
Only: Theотмеченные линии ((*)
) не будут компилироваться, поскольку ваш базовый класс не предоставляет соответствующий установщик!
В настоящее время существуют различные решения этой проблемы.Например, вы можете просто привести объект:
// if you are REALLY 100% sure the object is of appropriate type:
static_cast<AdapterTwo*>(adapter)->setClientBroker("...");
// if NOT:
AdapterTwo* a2 = dynamic_cast<AdapterTwo*>(adapter);
if(a2)
a2->setClientBroker("...");
else
// appropriate error handling
Вы можете найти более общее имя для функций set / get Broker / ClientConnection, чтобы они уже были чисто виртуальными в IAdapter
и переопределите их в двух реализующих классах адаптера, так что вы можете просто вызвать adapter->setXYZ("ampq");
. [Редактировать: в соответствии с вашим комментарием к вопросу, не вариант в данном случае]
Мой личный фаворит предоставляет дополнительный параметр для вашего createList
Функция такова, что сеттер уже будет вызываться внутри фабрики - возможно, с соответствующим значением по умолчанию: пустая строка, если вы выберете параметр std::string
, или nullptr
в случае char const*
.Разумеется, вы вызываете сеттер только в том случае, если параметр не соответствует значению по умолчанию ... Как вариант, вы можете иметь две перегрузки.