如何调整 C++ 代码以使用模板 class
how to adjust a c++ code to work with template class
以下代码是红黑树程序的一部分,它必须将 item
作为 char 或 int,所以我决定使用模板 class,但我不知道如何通过完整的程序扩展它,编译器向我发送了数千个错误:
代码中有德文名称,如果方便理解,我会翻译其中的一些:
baum = tree
knote = node
links = left
rechts = right
rot = red
doppel = double
mittlere = middle
eltern = parent
einfuegen = insert
rs = rb = red black
Knote.hpp
#pragma once
template <class T>
class Knote {
public:
Knote(T data = 0);
bool rot;
T item;
Knote *links;
Knote *rechts;
Knote *eltern;
};
Knote.cpp
#include "Knote.hpp"
Knote<int>::Knote(int data)
{
this->item = data;
eltern = nullptr;
links = nullptr;
rechts = nullptr;
rot = true;
}
现在剩下的该怎么办?
Baum.hpp
#pragma once
#include "Knote.hpp"
#include <vector>
class Baum
{
public:
Baum();
void einfuegen(int x);
void ausgabe_levelorder();
void ausgabe_inorder();
private:
Knote<int>* head;
void rs_einfuegen(Knote<int>* &knote, Knote<int>* &eltern, int x, bool sw);
int rot(Knote<int>* &knote);
void links_rotation(Knote<int> * &links_knote);
void rechts_rotation(Knote<int> * &links_knote);
void levelorder(Knote<int>* knote, std::vector<Knote<int>*> &knoteQueue, int niveau, std::vector<int> &niveauQueue);
void sort_levelorder(std::vector<Knote<int>*> &knoteQueue, std::vector<int> &niveauQueue);
void inorder(Knote<int>* knote);
};
Baum.cpp
#include "Baum.hpp"
#include <iostream>
using namespace std;
Baum::Baum()
{
...
}
// XXX
void Baum::einfuegen(int x)
{
...
}
// XXX
int Baum::rot(Knote<int>* &knote)
{
...
}
// XXX
void Baum::rs_einfuegen(Knote<int> *& knote, Knote<int> *&eltern, int x, bool sw)
{
...
}
// XXX
void Baum::links_rotation(Knote<int>* &links_knote)
{
...
}
// XXX
void Baum::rechts_rotation(Knote<int>* &rechts_knote)
{
...
}
// XXX
void Baum::ausgabe_levelorder()
{
...
}
// XXX
void Baum::levelorder(Knote<int>* knote, vector<Knote<int>*> &knoteQueue, int niveau, vector<int> &niveauQueue)
{
...
}
// XXX
void Baum::sort_levelorder(vector<Knote<int>*> &knoteQueue, vector<int> &niveauQueue)
{
...
}
// XXX
void Baum::ausgabe_inorder()
{
inorder(head->rechts);
cout << endl;
}
// XXX
void Baum::inorder(Knote<int>* knote)
{
if (knote != nullptr)
{
inorder(knote->links);
cout << knote->item << " ";
inorder(knote->rechts);
}
}
不需要在class中使用Knote<T>
。只需使用 Knote
。而不是
Knote<T> *links;
Knote<T> *rechts;
Knote<T> *eltern;
只需使用:
Knote *links;
Knote *rechts;
Knote *eltern;
使用 class 模板时,请确保提供模板参数。
Knote* head;
不对。您需要使用
Knote<int>* head;
或
Knote<char>* head;
您选择适合 Baum
的类型。
将 Knote
的实现从 .cpp 文件移动到 .h 文件。见 Why can templates only be implemented in the header file?.
对于 Knote.h,您的 template <typename T>
行应该是 template <class T>
此外,在 Knote 的构造函数中,您不能将 int(数据)分配给 T 变量(项目)。对于构造函数,您应该使用 T data
,而不是 int data
,因为您不知道需要什么类型的数据(因为它是模板)。
模板化 classes 也没有 cpp 文件。实现必须在 class 声明之后的 .h 中进行(除非向前声明)。如果您 do 想要将 header 和 "implementation" 代码部分分开,请保持 .h 正常,但为您的方法实现创建一个 .hpp 文件。在 class 声明后的 .h 中,放入 #include "Knote.hpp"
.
对于普通方法,格式如下:
template <typename T>
void Knote<T>::myMethod(parameters)
{
//normal method stuff
}
对于以模板化 class 作为参数的友元方法,例如重载的插入运算符 (<<),格式如下:
//in class declaration in .h
template <class T>
class Bob
{
//variables here
template <typename U>
void myfunc(Bob<U> value); //have to use a different template variable
}
//define as normal in the .hpp (or further down the file if no .hpp used)
以下代码是红黑树程序的一部分,它必须将 item
作为 char 或 int,所以我决定使用模板 class,但我不知道如何通过完整的程序扩展它,编译器向我发送了数千个错误:
代码中有德文名称,如果方便理解,我会翻译其中的一些:
baum = tree
knote = node
links = left
rechts = right
rot = red
doppel = double
mittlere = middle
eltern = parent
einfuegen = insert
rs = rb = red black
Knote.hpp
#pragma once
template <class T>
class Knote {
public:
Knote(T data = 0);
bool rot;
T item;
Knote *links;
Knote *rechts;
Knote *eltern;
};
Knote.cpp
#include "Knote.hpp"
Knote<int>::Knote(int data)
{
this->item = data;
eltern = nullptr;
links = nullptr;
rechts = nullptr;
rot = true;
}
现在剩下的该怎么办?
Baum.hpp
#pragma once
#include "Knote.hpp"
#include <vector>
class Baum
{
public:
Baum();
void einfuegen(int x);
void ausgabe_levelorder();
void ausgabe_inorder();
private:
Knote<int>* head;
void rs_einfuegen(Knote<int>* &knote, Knote<int>* &eltern, int x, bool sw);
int rot(Knote<int>* &knote);
void links_rotation(Knote<int> * &links_knote);
void rechts_rotation(Knote<int> * &links_knote);
void levelorder(Knote<int>* knote, std::vector<Knote<int>*> &knoteQueue, int niveau, std::vector<int> &niveauQueue);
void sort_levelorder(std::vector<Knote<int>*> &knoteQueue, std::vector<int> &niveauQueue);
void inorder(Knote<int>* knote);
};
Baum.cpp
#include "Baum.hpp"
#include <iostream>
using namespace std;
Baum::Baum()
{
...
}
// XXX
void Baum::einfuegen(int x)
{
...
}
// XXX
int Baum::rot(Knote<int>* &knote)
{
...
}
// XXX
void Baum::rs_einfuegen(Knote<int> *& knote, Knote<int> *&eltern, int x, bool sw)
{
...
}
// XXX
void Baum::links_rotation(Knote<int>* &links_knote)
{
...
}
// XXX
void Baum::rechts_rotation(Knote<int>* &rechts_knote)
{
...
}
// XXX
void Baum::ausgabe_levelorder()
{
...
}
// XXX
void Baum::levelorder(Knote<int>* knote, vector<Knote<int>*> &knoteQueue, int niveau, vector<int> &niveauQueue)
{
...
}
// XXX
void Baum::sort_levelorder(vector<Knote<int>*> &knoteQueue, vector<int> &niveauQueue)
{
...
}
// XXX
void Baum::ausgabe_inorder()
{
inorder(head->rechts);
cout << endl;
}
// XXX
void Baum::inorder(Knote<int>* knote)
{
if (knote != nullptr)
{
inorder(knote->links);
cout << knote->item << " ";
inorder(knote->rechts);
}
}
不需要在class中使用
Knote<T>
。只需使用Knote
。而不是Knote<T> *links; Knote<T> *rechts; Knote<T> *eltern;
只需使用:
Knote *links; Knote *rechts; Knote *eltern;
使用 class 模板时,请确保提供模板参数。
Knote* head;
不对。您需要使用
Knote<int>* head;
或
Knote<char>* head;
您选择适合
Baum
的类型。将
Knote
的实现从 .cpp 文件移动到 .h 文件。见 Why can templates only be implemented in the header file?.
对于 Knote.h,您的 template <typename T>
行应该是 template <class T>
此外,在 Knote 的构造函数中,您不能将 int(数据)分配给 T 变量(项目)。对于构造函数,您应该使用 T data
,而不是 int data
,因为您不知道需要什么类型的数据(因为它是模板)。
模板化 classes 也没有 cpp 文件。实现必须在 class 声明之后的 .h 中进行(除非向前声明)。如果您 do 想要将 header 和 "implementation" 代码部分分开,请保持 .h 正常,但为您的方法实现创建一个 .hpp 文件。在 class 声明后的 .h 中,放入 #include "Knote.hpp"
.
对于普通方法,格式如下:
template <typename T>
void Knote<T>::myMethod(parameters)
{
//normal method stuff
}
对于以模板化 class 作为参数的友元方法,例如重载的插入运算符 (<<),格式如下:
//in class declaration in .h
template <class T>
class Bob
{
//variables here
template <typename U>
void myfunc(Bob<U> value); //have to use a different template variable
}
//define as normal in the .hpp (or further down the file if no .hpp used)