我一直在使用继承来实现C ++中的红黑树。我有4个类,节点,树,RBNode,RBTree。
class Node
{
protected:
int data;
Node *left;
Node *right;
Node *parent;
public:
Node();
Node(int data);
void print_node(ofstream &file);
Node * find_node(int data);
void insert_node(Tree *t);
void left_rotate_node(Tree *t);
void right_rotate_node(Tree *t);
void delete_node(Tree *t);
}
class Tree
{
protected:
Node * root;
list<int> treedata;
public:
Tree();
virtual Node * get_root();
virtual void set_root(Node *root_node);
void insert_into_tree();
void delete_from_tree();
virtual void print_tree();
}
RBNode和RBTree分别继承Node,Tree。但我无法使用Node类的功能。例如,函数void Tree::insert_node(Tree *t);
即使在类RBNode中,除了函数接收RBTree作为参数之外,此函数执行相同的工作。如何在不在RBNode中重新声明它的情况下使用相同的功能。我想过在函数内部使用强制转换,但我怎么知道哪个类对象正在调用函数。
请给我一些建议。我是C ++的新手。
答案 0 :(得分:1)
未正确定义继承,或Node
上有Tree
而非class Tree;
class Node
{
protected:
int data;
Node *left,*right, *parent;
public:
Node(int data=0) : data(data), left(nullptr), right(nullptr), parent(nullptr) {}
void insert_node(Tree *t) { cout << "Insert" << endl; }
};
class Tree
{
protected:
Node * root;
list<int> treedata;
public:
Tree() : root(nullptr) {}
};
class RBSnode : public Node {}; // public inheritance
class RBStree : public Tree {};
...
RBSnode n;
RBStree t;
n.insert_node(&t);
中定义的混淆。
无论如何,以下最小代码示例编译得很好:
public
请注意,如果没有{{1}}继承说明符,则假定私有继承:在类中,您可以访问基类的所有受保护和公共成员,但在外部,类,您不能;看到继承的成员。我想这是发生在你身上的事情。