Допустим, следующий класс:
class FileManipulator
{
static InputTypeOne * const fileone;
InputTypeTwo *filetwo;
public:
FileManipulator( InputTypeTwo *filetwo )
{
this->filetwo = filetwo;
}
int getResult();
};
FileManipulator
использует данные из обоих файлов для получения вывода из getResult()
, Это означает, что несколько итераций filetwo
и несколько конструкций FileManipulators
с помощью итераций для разных InputTypeTwo
объекты. Входные данные, скажем, некоторые базы данных .csv. InputTypeOne
остается неизменным для всей задачи.
Сама программа является мультимодульной, и вышеописанная операция является лишь ее небольшим блоком.
Мой вопрос, как я могу справиться с этим static
поле в соответствии с объектно-ориентированной парадигмой и инкапсуляцией. Поле должно быть как-то инициализировано, так как оно не является фиксированным значением для разных исполнений программы. Насколько я понимаю правила C ++, я не могу создать метод для установки поля, но сделать его общедоступным и инициализировать его вне какого-либо класса (FileManipulator
или подружившийся класс) мне кажется, расходится с инкапсуляцией.
Что я могу сделать тогда? Единственное, что приходит мне в голову — это сделать это на языке C, а именно инициализировать его в достаточно изолированном модуле компиляции. Это действительно все, что я могу сделать? Как бы это было решено на профессиональном уровне?
Я исправил указатель на постоянный указатель на постоянный, что и было моим первоначальным намерением.
Вы можете написать открытый статический метод FileManipulator, который бы инициализировал поле для вас:
static void init()
{
fileone = something();
}
А затем вызовите его из main () или из другого места, где ваша программа инициализируется.
Один из способов сделать это, который приходит на ум, это:
В файле .cpp
FileManipulator::fileone = NULL;
Затем измените конструктор, чтобы сделать следующее:
FileManipulator( InputTypeTwo *filetwo, InputTypeOne *initValue = NULL)
{
if(fileone == NULL)
{
fileone = initValue;
}
this->filetwo = filetwo;
}
Или вы можете также определить функцию init и убедиться, что она вызывается перед использованием класса и после CTOR. Функция init будет включать логику того, как инициализировать fileone.