C ++ Множественное наследование и шаблоны - PullRequest
3 голосов
/ 04 августа 2011

Как мы все знаем, C ++ допускает множественное наследование.

Context

Я реализую сеть обработки, в которой некоторые узлы обработки являются связующим звеном между собой для обмена различными данными с помощью своего рода измененного шаблона Observer.

Узлом, который может отправлять определенный тип данных, является «DataSender», который затем расширяет этот абстрактный класс.

Узел, который может принимать данные определенного типа, является «DataReceiver», а затем расширяет этот абстрактный класс.

Вот мой код:

DataReceiver.h

template <typename TReceivedData>
class DataReceiver {
        public:
            void receiveData(TReceivedData* receivedData)
            {
                m_receivedData = receivedData;
            }
            TReceivedData* getReceivedData()
            {
                return(m_receivedData);
            }
        private:
            TReceivedData* m_receivedData;

DataSender.h

template <typename TSentData>
class DataSender {
            public:
                void sendData(TSentData* sentData) 
                {
                    set<DataReceiver<TSentData>*>::const_iterator it;
                    for(it = m_receiverList.begin(); it != m_receiverList.end(); ++it)
                        (*it)->receiveData(sentData);
                }

                void addDataReceiver(DataReceiver<TSentData>* dataReceiver) 
                {
                    m_receiverList.insert(dataReceiver);
                }

                void removeDataReceiver(DataReceiver<TSentData>* dataReceiver) 
                {
                    m_receiverList.erase(dataReceiver);
                }

            private:
                set<DataReceiver<TSentData>*> m_receiverList;
        };

Затем новый узел просто реализуется путем расширения одного или обоих этих абстрактных классов.

Вопрос

Мне нужен узел, который отправляет данные типа «Изображение» и «Текст»: тогда у меня есть узел: с:

class Node : public DataSender<Image>, DataSender<Text>

Ну, я думаю, вы уже видели мою проблему, компиляция этого не допустит, так как если я запустлю, возникает двусмысленность:

Node* node;
node->sendData(<my argument>);

потому что он не может отличить, какой sendData () от родительских классов (от наследования) должен использоваться (это распространенная проблема множественного наследования).

  • 1) Есть ли способ использовать sendData () с чем-то для устранения неоднозначности (я не уверен, что она есть?

  • 2) Есть ли другой способ решить мою проблему общения? (Я абсолютно хочу иметь возможность, что конечный пользователь, который хочет создать узел, который отправляет / получает данные, может легко сделать это, просто расширив что-то вроде интерфейса, и данные должны быть на разных «каналах»: например, узел может сможет обрабатывать текст и изображение, но отправит только изображение ...

Спасибо за помощь,

Julien

Ответы [ 2 ]

5 голосов
/ 04 августа 2011

Я не думаю, что у вас есть проблема неоднозначности, потому что две функции-члена sendData принимают разные аргументы. Проблема, скорее всего, связана с тем, что при определении, какая функция вызывать C ++, проверяется базовый класс в определенном порядке, но останавливается на первом, который имеет функцию-член с правильным name . Затем, если он нашел тот, который может принять аргумент, который вы указали, он вызывает его, в противном случае он выдаст ошибку, которую вы, вероятно, видели.

Что вы можете сделать, чтобы преодолеть эту проблему, это добавить следующие строки в определение Node класса:

using DataSender<Image>::sendData;
using DataSender<Text>::sendData;
5 голосов
/ 04 августа 2011

Это не красиво, но вы можете сказать, какую функцию базового класса вы собираетесь вызывать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...