R0 CREW

[Архитектурное решение] Как лучше по вашему мнению поступить?

Доброго времени суток.

Представим себе ситуацию, что есть у нас 4 класса: Parser, Info1, Info2, InfoHolder.
Парсер ,соотвесвенно, парсит какие-то данные и собирает их в классы Info1, Info2, которые являюся членами класса InfoHolder. Схематично код выглядит так:
class InfoHolder {
public:

void getSomeInterestingInfo(…);

void addDataToInfo1(...);
void addDataToInfo2(...);

private:
Info1 m_info1;
Info2 m_info2;
};

Собственно, Парсер каким-то образом заполняет классы Info1, Info2…

Код используется приблизиельно так:
Parser parser;
InfoHolder holder;
parser.start(someFilename, &holder);

holder.getSomeData();

Что мне в этом всем не нравится? То, что далее используя экзмемляр holder я могу вызвать методы, отвечающие за заполнение классов Info1, Info2, что не есть хорошо!!!

Как лучше в этой ситуации сделать? Может вообще есть какой-то хороший шаблон программирования?

Думал методы по добавлению данных в Info1 и Info2 сделать тоже приватными, но тогда надо будет делать другом класса класс Парсер, а фрнеды - это не очень есть хорошо…=(

То что сразу в голову пришло.

В класс InfoHolder, добавить конструктор:

InfoHodler::InfoHodler(Info1 *info1, Info2 *info2) {m_info1 = info1, m_info2 = info2;}

И удалить из него функции void addDataToInfo1(…) и void addDataToInfo2(…).

Сам объект InfoHolder, пусть создает функция start.

InfoHolder * Parser::start(string & someFilename);

а сами Info1 Info2 сделать членами класса Parser я так понимаю? И память по прежнему будет тогда чистить InfoHolder?

Не так, просто создавай их внутри функции start! Псевдо код:

start() {
    что-то там делается.
    ...
    // Создаем элемементы
    Info1 *info1 = new Info1(data1);
    Info2 *info2 = new Info2(data2);

    // Создаем и возвращаем InfoHolder
    return new InfoHolder(info1, info2);
}

Чистку элементов Info1, Info2 делаешь в деструкторе InfoHolder’a.