Нужно полное определение Entity в месте создания и вызова метода, RAII-владение объектом и возврат результата callMethod. По одному forward declaration нельзя ни выполнить new Entity, ни вызвать его метод.
Завершение рефакторинга простого класса
Нужно полное определение Entity в месте создания и вызова метода, RAII-владение объектом и возврат результата callMethod. По одному forward declaration нельзя ни выполнить new Entity, ни вызвать его метод.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дан фрагмент программы, который должен печатать «true» или «false» в стандартный вывод в зависимости от результата, возвращаемого методом, выбранным в коде. Часть рефакторинга уже выполнена, но её необходимо довести до завершённого состояния.
# include <memory>
# include <iostream>
# define ALL_RIGHT 0
class Entity;
class TaskExecutor {
public:
TaskExecutor() {
entityPtr_ = new Entity;
}
bool performTask() {
entityPtr_->callMethod();
// TODO: вернуть корректный результат
}
private:
Entity* entityPtr_;
};
int main() {
TaskExecutor executor;
auto result = executor.performTask();
std::cout << (result ? "true" : "false") << std::endl;
return ALL_RIGHT;
}
Необходимо исправить конструктор и метод performTask, обеспечить правильное управление динамической памятью, а также гарантировать, что программа выводит нужное значение.
Ответ
Нужно полное определение Entity в месте создания и вызова метода, RAII-владение объектом и возврат результата callMethod. По одному forward declaration нельзя ни выполнить new Entity, ни вызвать его метод.
Если реальный Entity::callMethod возвращает bool, после подключения его заголовка код может выглядеть так:
#include "Entity.h"
#include <memory>
class TaskExecutor {
std::unique_ptr<Entity> entityPtr_;
public:
TaskExecutor() : entityPtr_(std::make_unique<Entity>()) {}
bool performTask() {
return entityPtr_->callMethod();
}
};
Исходный Entity не приведён, поэтому заранее определить true или false нельзя. Если callMethod возвращает код ошибки, преобразование в bool нужно задать по его контракту, а не угадывать по наличию макроса ALL_RIGHT.