В классе C++(03) у меня есть переменная-член, которой должно присваиваться значение во время создания объекта. Однако только производный класс может вычислить требуемое значение. Как обсуждалось в этом сообщении C++ требует, чтобы вы инициализировали члены базового класса из его производного класса?, я понимаю, что производный класс не может инициализировать член базового класса, но для меня достаточно присваивания.
Следовательно, я предоставляю метод в базовом классе для присвоения значения, но я не могу понять, как заставить производный класс вызывать его. Приведенный ниже пример кода иллюстрирует этот момент.
class Base {
public:
Base() {}
setFoo(unsigned inFoo) { foo = inFoo; }
private:
unsigned foo;
};
class Derived : public Base {
Derived() : Base() {
unsigned desired = ... // do calculations to get the desired value
setFoo(desired); // --> how to ensure that derived class calls this?
}
};
Затем foo
используется несколькими другими методами базового класса. Даже если я установлю «флаг» в setFoo()
, нет метода «пост-конструктор», где я мог бы это проверить. В базовом классе есть несколько других методов, в которых используется foo
. Я мог бы проверить это там, но это слишком утомительно, подвержено ошибкам и неэффективно.
Мои извинения, если это было задано раньше. Я пытался найти его здесь, прежде чем спрашивать, выполнив поиск «Убедитесь, что конструктор производного класса должен вызывать определенный метод базового класса» и «Принудительно производный класс для назначения члена базового класса». Я наткнулся на несколько полезных сообщений Как я могу инициализировать константную переменную базового класса в конструкторе производного класса в C++? и Заставить производный класс использовать конструктор базового класса , но они, к сожалению, не решают мой вопрос.
Не могли бы вы предложить мне подходящий подход к разрешению этой ситуации? Желательна проверка во время компиляции, но если это невозможно, также может помочь проверка во время выполнения. Хотя я не могу использовать C++11 для решения своей проблемы, я был бы рад узнать о любых решениях C++11. Спасибо за внимание.
Изменить Конечно, задокументировать это как требование также можно, но я хотел бы узнать, существует ли программное решение.
Edit2 Я согласен с ответами о том, что значение должно быть передано в параметре конструктора, и если бы мне пришлось писать Base
с нуля, я бы не просил такой подход. Проблема в том, что из-за устаревших причин Base
уже имеет несколько параметров конструктора (9), и я надеялся избежать добавления дополнительных (3), «выгружая» их в тело конструктора. Однако в долгосрочной перспективе код должен быть рефакторинг.
Edit3 Извините за столько правок. Я могу изменить класс Base
по своему усмотрению, но класс Derived
находится в клиентском коде, которым я не могу управлять.