C++ C++;如何使用模板声明为atribute,一个指向我自己类型的指针

C++ C++;如何使用模板声明为atribute,一个指向我自己类型的指针,c++,pointers,attributes,C++,Pointers,Attributes,这就是我的问题:我有一个类“Nodo”(用来生成BSTs),它有一个指向属性相同类型的指针数组,然后我有一个子类“NodoAvl”(用来生成AVL树),它必须继承这个atribute,但指针必须指向它的相同类型,即指向“NodoAvl”。有没有办法做到这一点?也许通过我的代码,我可以更好地解释: #include<iostream> using namespace std; template <class T> class Nodo { protected: T

这就是我的问题:我有一个类“Nodo”(用来生成BSTs),它有一个指向属性相同类型的指针数组,然后我有一个子类“NodoAvl”(用来生成AVL树),它必须继承这个atribute,但指针必须指向它的相同类型,即指向“NodoAvl”。有没有办法做到这一点?也许通过我的代码,我可以更好地解释:

#include<iostream>
using namespace std;

template <class T>
class Nodo
 {
 protected:
  T d;
  "my_own_type" *h[2] = {NULL};  // Here I need pointers to my own type 
                                 // so Nodo has 2 pointers to Nodo
                                 // and NodoAvl has 2 pointers to NodoAvl
 public:
  Nodo(T dato = T()) { d = dato; }
 };

template <class T>
class NodoAvl : public Nodo<T>
 {
 protected:
  int alt = 0;
 public:
  NodoAvl (T dato = T()): Nodo<T>(dato) {}
  int altu () {return alt;}
 };
#包括
使用名称空间std;
模板
野藤班
{
受保护的:
td;
“我自己的类型”*h[2]={NULL};//这里我需要指向我自己类型的指针
//所以Nodo有两个指向Nodo的指针
//NodoAvl有两个指向NodoAvl的指针
公众:
Nodo(T dato=T(){d=dato;}
};
模板
类NodoAvl:公共Nodo
{
受保护的:
int-alt=0;
公众:
NodoAvl(T dato=T()):Nodo(dato){}
int altu(){return alt;}
};
我将非常感激你的帮助


---更新---

我刚刚读过关于CRTP的书(感谢一些程序员),虽然我不了解它的所有功能,但我发现它可以解决我的问题。我决定让“Nodo”成为一个大的父类,在其模板“TN”(节点类型)中添加一个标签,这样我的指针数组就可以声明为TN*。然后我创建了两个子类:NodoBst和NodoAvl,每个子类继承自“Nodo”,但在模板中标记了各自的节点类型。同样,我的代码将更好地解释我的想法

#include<iostream>
using namespace std;

template <class T, class TN>
class Nodo
 {
 protected:
  T d;
  TN *h[2] = {NULL};
 public:
  Nodo(T dato = T()) { d = dato; }
 };

template <class T>
class NodoBst : public Nodo<T,NodoBst<T>>
 {
 protected:
 public:
  NodoBst (T dato = T()): Nodo<T,NodoBst<T>>(dato) {}
 };

template <class T>
class NodoAvl : public Nodo<T, NodoAvl<T>>
 {
 protected:
  int alt = 0;
 public:
  NodoAvl (T dato = T()): Nodo<T,NodoAvl<T>>(dato) {}
  int altu () {return alt;}
 };

int main ()
 {
 NodoAvl<int> * narval = new NodoAvl<int>(10);
 cout << narval->altu();
 }
#包括
使用名称空间std;
模板
野藤班
{
受保护的:
td;
TN*h[2]={NULL};
公众:
Nodo(T dato=T(){d=dato;}
};
模板
类NodoBst:公共Nodo
{
受保护的:
公众:
NodoBst(T dato=T()):Nodo(dato){}
};
模板
类NodoAvl:公共Nodo
{
受保护的:
int-alt=0;
公众:
NodoAvl(T dato=T()):Nodo(dato){}
int altu(){return alt;}
};
int main()
{
NodoAvl*narval=新的NodoAvl(10);
cout altu();
}

这已经奏效了,但我想知道这是一个好的做法还是我在制造未来的问题。我想在父类中添加更多的方法,父类使用指针数组,并且所有方法在任何类型的节点中都是相同的(ej:更新指针、取消引用、杀死指针等等)。如果你必须解决这个问题,你会怎么做?再次非常感谢

你可以用显而易见的方法:

Nodo<T>* h[2];

没有办法按照您建议的方式获得类的动态类型。每个
Nodo
类必须是具有相同声明的同一类。它无法知道特定的
Nodo
是否被用作基类。因此,它不能改变自己的定义来匹配从中派生出来的人


执行您建议的操作的唯一方法是,通过将派生类作为模板参数传递,告诉它派生自哪个类。而且不可能将自己的类作为模板参数传递给自己。因此,您需要有一个不接受派生类的
Nodo
专门化。您应该将其标记为
final
,以防止人们从中派生。

在这方面,“属性”是什么意思?对不起,我认为最好的词应该是“member”。是的,但在这种情况下,NodoAvl将继承指向“Nodo”的指针,而不是指向“NodoAvl”的指针。我需要每种对象都有指向同一类对象的指针object@AliRojas我想你是在找那个。非常感谢你的建议!也许这就解决了我的问题。请阅读我的更新,并告诉我,如果这是你的意思,或者如果你发现任何问题。谢谢!!!非常感谢你的回答。我不太理解最后一部分。你能给我举个简单的例子吗?(任何能帮助我理解这个想法的人)我会非常感激的。Nicol Bolas,我刚刚读到了关于CRTP的文章,似乎是一个模板本身作为参数的例子。请阅读我的更新,如果发现任何问题,请告诉我。我对这门课很感兴趣。谢谢!
Nodo* h[2];