gpt4 book ai didi

C++如何使用模板声明为属性,指向我自己的类型的指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:45:04 25 4
gpt4 key购买 nike

这是我的问题:我有一个类“Nodo”(制作 BST),它有一个指针数组,指向与属性相同的类型,然后我有一个子类“NodoAvl”(制作 AVL 树),它必须继承该属性,但指针必须指向其相同类型,即指向“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;}
};

我会很感激你的帮助。


---更新---

我刚刚阅读了有关 CRTP 的内容(感谢一些程序员),虽然我不理解它的所有实用性,但我发现它可以解决我的问题。我决定让“Nodo”成为一个父类,在它的模板“TN”(节点类型)中添加一个标签,这样我的指针数组就可以声明为 TN*。然后我创建了 2 个子类: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();
}

它奏效了,但我想知道这是否是一个好的做法,或者我正在制造 future 的问题。我想向与指针数组一起工作的父类添加更多方法,并且所有这些方法在任何类型的节点中都是相同的(ej:更新指针,取消引用它们,杀死它们等)。如果你必须解决这个问题,你会怎么做?再次感谢!

最佳答案

你可以用显而易见的方式做到这一点:

Nodo<T>* h[2];

但您也可以仅通过使用类名来完成:

Nodo* h[2];

关于C++如何使用模板声明为属性,指向我自己的类型的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40441665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com