Введение
Давайте представим этот простой пример:
#include <cmath>
class X
{
public: // Members
/// A ^ B + A
int A;
/// A ^ B + B
int B;
public: // Specials
X(
const int & A,
const int & B
)
: A(A)
, B(B)
{
const auto Pow = static_cast<int>(std::pow(A, B));
this->A += Pow;
this->B += Pow;
}
};
Викторины
- Введенный класс имеет две переменные-члены:
A
и B
. - Они принимают значения
A ^ B + A
и A ^ B + B
соответственно. - Оба они имеют общий комплексный код инициализации (допустим,
std::pow
сложный).
Задача
Я бы хотел, чтобы члены A
и B
const
.
Вопрос
Как это сделать, не повторяя сложную инициализацию( т.е. избегать вызова std::pow
дважды)?
Что я пробовал
#include <cmath>
class X
{
public: // Members
/// A ^ B + A
const int A;
/// A ^ B + B
const int B;
public: // Helpers
struct Init
{
public: // Members
int A;
int B;
public: // Specials
Init(
const int & A,
const int & B
)
: A(A)
, B(B)
{
const auto Pow = static_cast<int>(std::pow(A, B));
this->A += Pow;
this->B += Pow;
}
};
public: // Specials
X(
const Init& Init
)
: A(Init.A)
, B(Init.B)
{};
X(
const int & A,
const int & B
)
: X(Init(
A,
B
))
{};
};
- Создать
struct Init
, который принимает роль предыдущей версиикласс X
. - Создание
X
членов const
при сохранении Init
членов не const
. - Использование делегирования конструктора для перенаправления аргументов конструктора в
Init
. - Переместите не
const
переменные-члены из Init
в X
и сделайте их const
.
Однако, мойРешение кажется слишком сложным.Мы будем благодарны за любую помощь.
Нет целей
- Создайте еще одну
X
переменную-член, которая будет хранить общий результат кода ( т.е. std::pow
). - Добавьте еще один уровень косвенности вне класса
X
( например, введите базовый класс для X
).
Примечание
Решения могутиспользуйте более новые версии C ++, чем C ++ 11.