【发布时间】:2016-01-15 19:46:16
【问题描述】:
正如您可能从标题中注意到的那样,我有不同的类,特别是 3 个,每个类都响应不同的树实现。
在 Tree1.h 中
class Tree1 {
public:
struct node{
char label;
node* nHMI_ptr;
node* nHD_ptr;
};
node* root;
Tree1();
~Tree1();
bool Empty();
Tree1::node& Root();
void AddSon(int i, node &n, char l);
/*
*
* (other functions)
*/
}
在 Tree2.h 中
class Tree2 {
public:
struct node{
char label;
node* nHMI_ptr;
node* nHD_ptr;
node* nFather_ptr;
node* nHI_ptr;
};
node* root;
Tree2();
~Tree2();
bool Empty();
Tree2::node& Root();
void AddSon(int i, node &n, char l);
/*
*
* (other functions)
*/
}
在 Tree3.h 中
class Tree3{
public:
Tree3();
~Tree3();
struct node;
struct nodeSon{
struct node* node_ptr;
nodeSon* nextNodeSon_ptr;
};
struct node{
char label;
node* nextNode_ptr;
struct nodeSon* nSon;
};
node* root;
bool Empty();
Tree3::node& Root();
void AddSon(int i, node &n, char l);
/*
*
* (other functions)
*/
}
如您所见,它们具有相同名称或标识符下的函数和成员。这是因为我想使用这个函数制作各种更复杂的算法,但棘手的部分是我想让这个算法独立于所使用的类。我首先想到的是在我的 main.cpp 上创建这个算法。
在 main.cpp 中
#include <cstdlib>
#include <iostream>
#include "Tree1.h"
//#include "Tree2.h"
//#include "Tree3.h"
void someFunc(node n) {
//do something by calling Tree functions
//E.g. call Empty(), call AddSon(...)
}
int main(int argc, char** argv) {
return 0;
}
我想要实现的是 someFunc(...) 可以在所有树上工作,而无需更改任何底层代码,只需启用 #include 之一并禁用其他两个即可。
- 有可能吗?
- 我怎样才能做到这一点?
【问题讨论】:
-
博士; TL;使用模板创建
someFunc的通用版本。 -
也可以让各种树类继承自定义所有通用树功能的纯虚类BaseTree,然后调用
void someFunc(BaseTree& tree, node n) -
@user4581301 不。
node不能在运行时推导,除非它已经在基类中声明。 -
啊,废话。你说得对。类中嵌入了各种 Node 定义。我坏了。
标签: c++ function class tree include