статические члены и инкапсуляция в переполнении стека

Допустим, следующий класс:

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, а именно инициализировать его в достаточно изолированном модуле компиляции. Это действительно все, что я могу сделать? Как бы это было решено на профессиональном уровне?

редактировать

Я исправил указатель на постоянный указатель на постоянный, что и было моим первоначальным намерением.

-1

Решение

Вы можете написать открытый статический метод FileManipulator, который бы инициализировал поле для вас:

static void init()
{
fileone = something();
}

А затем вызовите его из main () или из другого места, где ваша программа инициализируется.

0

Другие решения

Один из способов сделать это, который приходит на ум, это:

В файле .cpp

FileManipulator::fileone = NULL;

Затем измените конструктор, чтобы сделать следующее:

FileManipulator( InputTypeTwo *filetwo,  InputTypeOne  *initValue = NULL)
{
if(fileone == NULL)
{
fileone = initValue;
}
this->filetwo = filetwo;
}

Или вы можете также определить функцию init и убедиться, что она вызывается перед использованием класса и после CTOR. Функция init будет включать логику того, как инициализировать fileone.

0

По вопросам рекламы [email protected]