Передача информации между различными ветвями классовой иерархии в C ++?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Передача информации между различными ветвями классовой иерархии в C ++?

Сообщение Anonymous »

Итак, у меня есть классовая иерархия, которая выглядит так: < /p>
Это встроенный проект, поэтому весь код будет выполняться снова и снова.

Код: Выделить всё

class Algorithm1 { Algo1Output out; };
class Algorithm2 { Algo2Output out; };
class Algorithm3 { Algo3Output out; };
Эти классы алгоритма организованы классом алгоритмов . Этот класс собирает выходы алгоритмов в агрегированном выходе (это просто ссылки на отдельные выходы). < /P>

Код: Выделить всё

class Algorithms {
Algorithm1 a1{};
Algorithm2 a2{};
Algorithm3 a3{};
AlgosOutput out{ a1.out, a2.out, a3.out };
};

class AlgosOutput {
Algo1Output& a1out;
Algo2Output& a2out;
Algo3Output& a3out;
};
Алгоритмы , в свою очередь, управляется классом Manager , который также управляет компьютером состояния и имеет свой собственный вывод, который является лишь ссылкой на выходы алгоритмов и Statemachine :

Код: Выделить всё

class Manager {
StateMachine sm;
Algorithms a;

ManagerOutput out{ sm.out, a.out };
};

class StateMachine {
SmOutput out;
};
< /code>
Вся эта иерархия получает свои входы из общего источника, который просто передается при инициализации. Конструкторы в основном выглядят почти одинаково: < /p>
Manager(InputData& inData) : sm(inData), a(inData) {}

StateMachine(InputData& inData) : inData(inData) {}  // holds a reference to inData for actual use

Algorithms(InputData& inData) : a1(inData), a2(inData), a3(inData) {}

Algorithm1(InputData& inData) : inData(inData) {}
Algorithm2(InputData& inData) : inData(inData) {}
Algorithm3(InputData& inData) : inData(inData) {}
Таким образом, у всех компонентов есть ссылка на indata (доступ только для чтения, но я пытался соблюдать краткое краткое изложение фрагментов кода), а Indata обновляется с новой информацией каждый цикл выполнения. И каждый класс в иерархии имеет доступ к выводу классов, непосредственно под ним (который, в свою очередь, содержит Outptus классов, непосредственно под ними и т. Д.). После выполнения, согласно новому состоянию, в котором находится Statemachine , будет использоваться результат одного из 3 классов алгоритма. Эта логика находится в менеджере :

Код: Выделить всё

void Algorithms::execute() {
a1.execute();
a2.execute();
a3.execute();
}

void Manager::execute() {
sm.execute();
a.execute();

switch (out.stateMachineOut.currentState) {
// select one of the 3 algo results for further use
}
}
Проблема заключается в том, что теперь Algorithm2 требует текущего состояния машины состояния для функционирования. Поэтому мне нужен способ передать эту информацию. В идеале элегантный способ, который не включает в себя сложную структуру дизайна, такую ​​как медиатор. Внутренние внутренние системы. Однако из -за того, как работает инициализация C ++, это будет означать, что внутренний менеджер , Statemachine всегда должен оставаться объявленным выше алгоритмов , поэтому он инициируется до алгоритмов , что означает, что мне придется разместить большой комментарий с «оставить машину состояния выше алгоритмы» и надежду, что другие разработчики будут читать его. Передайте текущее состояние Statemachine в качестве аргумента Algorithms :: execute () (что, в свою очередь, передаст его в 3 классы алгоритма). Этот метод также дает мне ощущение, что это будет плохой практикой, поскольку все классы в основном используют только Indata в качестве входных данных, и если бы я добавил в них один единый аргумент, ситуация классов алгоритма изменится на ввод, который будет разделен, примерно с 95% значений ввода внутри Indata , и один входной значение будет передаваться как аргумент. Есть ли что -то, о чем я не думал? Или степень связи неизбежна, поскольку мне в основном нужно внести выход Statemachine в алгоритмы в любом случае?

Подробнее здесь: https://stackoverflow.com/questions/794 ... archy-in-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»