Я работаю над небольшим фреймворком на C++ для использования в некоторых своих проектах, чтобы статически ссылаться на него как на полезную библиотеку. Я думаю, вы могли бы сравнить его с более специфичными для домена моими личными потребностями и более простой библиотекой, например, juce. Это упражнение для обучения и опыта, как и все остальное, поэтому я хотел бы потратить время на правильное и правильное понимание методы, которые я применяю. В настоящее время я работаю в Linux, но для того, чтобы код был переносимым, это позволит мне написать какой-либо конкретный код платформы для интерфейса.Лучший способ для идентификатора унаследованного класса
В настоящее время я работаю над базовой системой обмена сообщениями, которую я бы хотел разрешить для сообщений, содержащих объекты разных типов. Моя первая мысль была так:
class Message {
virtual std::string type;
};
class DataMessage : Message {
std::vector<std::string> *data;
};
Мой вопрос, что это лучший способ, чтобы определить, что сообщение является DataMessage, и либо брось его фактического типа, или получить доступ к данным он содержит?
Я могу использовать строку для типа, как указано выше, но это не гарантирует, что каждый подкласс действительно имеет уникальный идентификатор типа. Кроме того, я задаюсь вопросом, будет ли накладные расходы на обработку строк медленнее, чем альтернатива (например, я могу расширить перечисление?).
Что касается доступа к данным, если я могу направить сообщение в соответствующий тип, это не проблема. В противном случае я мог бы добавить виртуальную функцию к базовому классу как к аксессуру (но как же мне использовать другой тип возвращаемого значения для того, который указан в базовом классе? Что делать, если класс не нуждается в дополнительных данных?) или как рабочая функция, действующая на данные (но я предпочел бы иметь ее как механизм передачи данных между классами по сравнению с структурой стиля обратного вызова).
Любые предложения, альтернативы или ссылки очень ценятся. Обсуждение различных подходов было бы удивительным!
Спасибо заранее, ребята.
Я думаю, что типичным ответом будет «не надо». Попытайтесь определить, что сообщение должно делать абстрактным способом. Сделайте чистую виртуальную функцию-член в базе, а затем реализуйте ее по-разному, подходящую для производных типов. –
Скорее всего, я смотрю на это довольно наивно, поскольку я все еще участвую. В качестве примера, как бы вы изменили следующее: – StillLearningCPP
Извините за двойной пост: Объект DataProcessor контролирует очередь входящего сообщения для управления его состоянием. Он ищет ControlMessage, содержащий перечисление (START, STOP) или FeedbackMessage, содержащие некоторые данные для настройки внутренней модели. Вместо того чтобы предоставлять доступ ко внутренним функциям, я бы хотел, чтобы класс DataProcessor обрабатывал обратные вызовы динамически. – StillLearningCPP