2014-02-18 3 views
0

У меня есть класс формы:C++ полиморфизм и шаблон класса

template redblacknode<T> 

, который хранится в дереве формы:

template redblacktree<redblacknode<T> > 

Для конкретного дерева я хочу узлы на обоих хранить ту же информацию (две разные длинные), но индексироваться по разным значениям.

Я инициализация узлов, как это:

PageRecord addPR = PageRecord(pageNumber, -1); 
findNode = new redblackNode<PageRecord>(addPR); 

Может ли я получить полиморфное поведение из-за этого (от перегрузки == и < операторов), даже если я не затыкать указатель в узел?

+1

findNode - это указатель, не так ли? – 4pie0

+0

Да, но addPR не – adrianmcmenamin

+1

Вы уверены, что хотите, чтобы ваше дерево было templatized по типу вашего узла? Разве вы не определили бы свой 'redblacktree ' так, чтобы 'T' был тем же' T', что и в 'redblacknode '? – jia103

ответ

1

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

template<typename T> 
class redblacknode 
{ 
public: 
    redblacknode(T t) : m_t(t) {} 
    T getT() const { return m_t; } 
private: 
    T m_t; 
}; 

template<typename T> inline 
bool operator< (const redblacknode<T>& lhs, const redblacknode<T>& rhs) { return lhs.getT() < rhs.getT(); } 

в main.cpp:

redblacknode<int> a(1); 
redblacknode<int> b(2); 
redblacknode<int>* c = new redblacknode<int>(3); 

qDebug() << (b < a); // print false 
qDebug() << (b < *c); // print true 

После, если вы хотите динамический полиморфизм (в основном, виртуальные функции + указатели) , это зависит от определения вашего шаблона redblacknode (вам понадобится суперкласс, см. CRTP).

Edit: Я предполагаю, что ваш тип указателя redblackNode *

Edit2: Я немного изменился мой код, чтобы отразить ваше.

+0

Я, наверное, здесь немного глуп, но где полиморфизм? Они все в порядке, не так ли? – adrianmcmenamin

+0

Действительно, я не использовал статический полиморфизм - только классический шаблон, так как (если бы я правильно понял ваш вопрос), вам может не понадобиться статический полиморфизм. Статический полиморфизм больше понравится: template class Base {}; класс Derived1: public Base < Derived1 > {}; класс Derived2: public Base < Derived2 > {}; В этом случае, что такое использование PageRecord? – Armaghast

+0

Предлагаю вам проверить http://eli.thegreenplace.net/2011/05/17/the-curiously-recurring-template-pattern-in-c; статический полиморфизм будет необходим, если вы хотите сравнить 2 PageRecord с использованием интерфейса PageRecord; но для того чтобы сравнить их, у вас есть дополнительные ссылки для redblacknode . – Armaghast

Смежные вопросы