Binary_tree.h#ifndef Binary_Tree
#define Binary_Tree//Node类
template <class Entry>
struct Binary_node
{
// data members:
Entry data;
Binary_node<Entry> *left;
Binary_node<Entry> *right;
// constructors:
Binary_node( );
Binary_node(const Entry &x);
};
//Binary_Tree类
template <class Entry>
class Binary_tree
{
public:
Binary_tree();
Binary_tree(const Binary_tree<Entry> &x);
~Binary_tree();
Binary_tree & operator = (const Binary_tree<Entry> &original);
bool empty() const;
void preorder(void (*visit)(Entry &));
void inorder(void (*visit)(Entry &));
void postorder(void (*visit)(Entry &));
int size( ) const;
void clear( );
int height( ) const;
void insert(const Entry &);
protected:
Binary_node<Entry> *root;
void recursive_inorder(Binary_node<Entry> *sub_root,void (*visit)(Entry &));
int recursive_size(Binary_node<Entry> *sub_root) const;
int recursive_height(Binary_node<Entry> *sub_root) const;
Binary_node<Entry> *recursive_copy(Binary_node<Entry> *sub_root);
};#endif
Binary_tree.cpp#include "Binary_Tree.h"
#include "iostream"
using namespace std;template <class Entry>
Binary_tree<Entry>::Binary_tree()
{
root=NULL;
}template <class Entry>
Binary_tree<Entry>::Binary_tree(const Binary_tree<Entry> &x)
{
root=recursive_copy(x.root);
}template <class Entry>
Binary_tree<Entry>::~Binary_tree()
{
root=NULL;
}template <class Entry>
bool Binary_tree<Entry> :: empty( ) const
{
return root == NULL;
}template <class Entry>
int Binary_tree<Entry>::size() const
{
return recursive_size(root);
}template <class Entry>
int Binary_tree<Entry>::height() const
{
return recursive_height(root);
}template <class Entry>
int Binary_tree<Entry> :: recursive_height(Binary_node<Entry> *sub_root) const
{
if (sub_root == NULL) return 0;
int l = recursive_height(sub_root->left);
int r = recursive_height(sub_root->right);
if (l > r) return 1 + l;
else return 1 +r;
}template <class Entry>
void Binary_tree<Entry> :: inorder(void (*visit)(Entry &))
{
recursive_inorder(root, visit);
}template <class Entry>
void Binary_tree<Entry> ::recursive_inorder(Binary_node<Entry> *sub_root,void (*visit)(Entry &))
{
if (sub_root != NULL)
{
recursive_inorder(sub_ root->left, visit);
(*visit)(sub_root->data);
recursive_inorder(sub_root->right, visit);
}
}template <class Entry>
int Binary_tree<Entry> :: recursive_size(Binary_node<Entry> *sub_root) const
{
if (sub_root == NULL) return 0;
return 1+recursive_size(sub_root->left)+ recursive_size(sub_root->right);
}template <class Entry>
Binary_node<Entry> *Binary_tree<Entry> :: recursive_copy(Binary_node<Entry> *sub_root)
{
cout << "执行了copy函数" << endl;
if (sub_root == NULL) return NULL;
Binary_node<Entry> *temp = new Binary_node<Entry>(sub_root->data);
temp->left = recursive_copy(sub_root->left);
temp->right = recursive_copy(sub_root->right);
return temp;
}Main.cpp
#include "iostream"
#include "Binary_Tree.cpp"
using namespace std;
void main()
{
Binary_tree<int> my;
cout << my.size() << endl; Binary_tree<int> my1(my);
cout << my1.size(); Binary_tree<int> my2(my);
}
不是我自己写的代码,是老师PPt上拷贝的,同学拷贝的没有错误,我拷过来就有错误,错误如下:
Main.obj : error LNK2001: unresolved external symbol "public: __thiscall Binary_node<int>::Binary_node<int>(int const &)" (??0?$Binary_node@H@@QAE@ABH@Z)
Debug/Binary_tree.exe : fatal error LNK1120: 1 unresolved externals
大概是说我的那个重载的构造函数找不到,但是我将那个构造函数
template <class Entry>
Binary_tree<Entry>::Binary_tree(const Binary_tree<Entry> &x)
{
root=recursive_copy(x.root);
}
的哪一行 root=recursive_copy(x.root);屏蔽掉,然后编译,错误;删掉debug内容,编译,通过,运行,出错;恢复那一行,删掉debug,编译通过,运行出错;快崩溃了。换了一台电脑,用2010编译(之前是6.0),同样的错误。崩溃了……
#define Binary_Tree//Node类
template <class Entry>
struct Binary_node
{
// data members:
Entry data;
Binary_node<Entry> *left;
Binary_node<Entry> *right;
// constructors:
Binary_node( );
Binary_node(const Entry &x);
};
//Binary_Tree类
template <class Entry>
class Binary_tree
{
public:
Binary_tree();
Binary_tree(const Binary_tree<Entry> &x);
~Binary_tree();
Binary_tree & operator = (const Binary_tree<Entry> &original);
bool empty() const;
void preorder(void (*visit)(Entry &));
void inorder(void (*visit)(Entry &));
void postorder(void (*visit)(Entry &));
int size( ) const;
void clear( );
int height( ) const;
void insert(const Entry &);
protected:
Binary_node<Entry> *root;
void recursive_inorder(Binary_node<Entry> *sub_root,void (*visit)(Entry &));
int recursive_size(Binary_node<Entry> *sub_root) const;
int recursive_height(Binary_node<Entry> *sub_root) const;
Binary_node<Entry> *recursive_copy(Binary_node<Entry> *sub_root);
};#endif
Binary_tree.cpp#include "Binary_Tree.h"
#include "iostream"
using namespace std;template <class Entry>
Binary_tree<Entry>::Binary_tree()
{
root=NULL;
}template <class Entry>
Binary_tree<Entry>::Binary_tree(const Binary_tree<Entry> &x)
{
root=recursive_copy(x.root);
}template <class Entry>
Binary_tree<Entry>::~Binary_tree()
{
root=NULL;
}template <class Entry>
bool Binary_tree<Entry> :: empty( ) const
{
return root == NULL;
}template <class Entry>
int Binary_tree<Entry>::size() const
{
return recursive_size(root);
}template <class Entry>
int Binary_tree<Entry>::height() const
{
return recursive_height(root);
}template <class Entry>
int Binary_tree<Entry> :: recursive_height(Binary_node<Entry> *sub_root) const
{
if (sub_root == NULL) return 0;
int l = recursive_height(sub_root->left);
int r = recursive_height(sub_root->right);
if (l > r) return 1 + l;
else return 1 +r;
}template <class Entry>
void Binary_tree<Entry> :: inorder(void (*visit)(Entry &))
{
recursive_inorder(root, visit);
}template <class Entry>
void Binary_tree<Entry> ::recursive_inorder(Binary_node<Entry> *sub_root,void (*visit)(Entry &))
{
if (sub_root != NULL)
{
recursive_inorder(sub_ root->left, visit);
(*visit)(sub_root->data);
recursive_inorder(sub_root->right, visit);
}
}template <class Entry>
int Binary_tree<Entry> :: recursive_size(Binary_node<Entry> *sub_root) const
{
if (sub_root == NULL) return 0;
return 1+recursive_size(sub_root->left)+ recursive_size(sub_root->right);
}template <class Entry>
Binary_node<Entry> *Binary_tree<Entry> :: recursive_copy(Binary_node<Entry> *sub_root)
{
cout << "执行了copy函数" << endl;
if (sub_root == NULL) return NULL;
Binary_node<Entry> *temp = new Binary_node<Entry>(sub_root->data);
temp->left = recursive_copy(sub_root->left);
temp->right = recursive_copy(sub_root->right);
return temp;
}Main.cpp
#include "iostream"
#include "Binary_Tree.cpp"
using namespace std;
void main()
{
Binary_tree<int> my;
cout << my.size() << endl; Binary_tree<int> my1(my);
cout << my1.size(); Binary_tree<int> my2(my);
}
不是我自己写的代码,是老师PPt上拷贝的,同学拷贝的没有错误,我拷过来就有错误,错误如下:
Main.obj : error LNK2001: unresolved external symbol "public: __thiscall Binary_node<int>::Binary_node<int>(int const &)" (??0?$Binary_node@H@@QAE@ABH@Z)
Debug/Binary_tree.exe : fatal error LNK1120: 1 unresolved externals
大概是说我的那个重载的构造函数找不到,但是我将那个构造函数
template <class Entry>
Binary_tree<Entry>::Binary_tree(const Binary_tree<Entry> &x)
{
root=recursive_copy(x.root);
}
的哪一行 root=recursive_copy(x.root);屏蔽掉,然后编译,错误;删掉debug内容,编译,通过,运行,出错;恢复那一行,删掉debug,编译通过,运行出错;快崩溃了。换了一台电脑,用2010编译(之前是6.0),同样的错误。崩溃了……
解决方案 »
- 如何调整画线的亮度呢?
- 用PrintWindow截取不规则窗口的问题
- Windows 2000 下的AttatchConsole替代品是什么?
- 在VS2005中怎么才能让我定义的虚函数出现在【属性】窗口Overrides栏目中,看帖子吧,内有详细说明?
- FlexGrid里怎么放图片
- 怎么编程实现对交换机端口的控制?(允许和禁止使用)
- 假如一个DLL自己动态载入了第2个DLL 然后这个DLL提前被FreeLibrary,那么如何FreeLibrary第2个DLL呢?
- 如何释放CArray<CString*,CString*> m_pStrArray之类的内存?
- 在基于对话框的程序中关于Thread的问题?
- 代码已给出 怎么生成3D旋转立方体
- CStatic::Create 方法中this指针为空怎么回事
- 关于strcpy_s的问题
struct Binary_node
{
// data members:
Entry data;
Binary_node<Entry> *left;
Binary_node<Entry> *right;
// constructors:
Binary_node( );
Binary_node(const Entry &x);
};
把struct改为class,或者添加public:
#include "Binary_Tree.cpp"???
应该是 #include "Binary_Tree.h" 吧?
//Node类
template <class Entry>
struct Binary_node
{
// data members:
Entry data;
Binary_node<Entry> *left;
Binary_node<Entry> *right;
// constructors:
Binary_node( );
Binary_node(const Entry &x);
};这个只有定义,没有实现,必须把实现部分也拷贝过来。
这个按理说是包含头文件,但是据说使用了模板类以后必须要么实现也在头文件里,要么包含cpp文件,不然每个函数实现都找不到。
struct Binary_node
{
// data members:
Entry data;
Binary_node<Entry> *left;
Binary_node<Entry> *right;
// constructors:
Binary_node( ); // 这里的问题吧
Binary_node(const Entry &x);
};