静态函数指针成员--undefined reference to

xuyan505 2016-03-18 02:03:17
描述如下:
目标:实现二叉树的前序遍历
实现方式:链表
思路:在二叉树类成员中定义一函数指针 static void (*visit)(binaryTreeNode<E>*),然后将output函数地址赋给visit,最后在preOrder中进行遍历。
编译错误:
PS:一直不知道问题所在,特来此求助!谢谢!

1. 定义了binaryTreeNode结构体

#ifndef binaryTreeNode_
#define binaryTreeNode_

template <class T>
struct binaryTreeNode
{
T element;
binaryTreeNode<T> *leftChild,
*rightChild;

binaryTreeNode() {leftChild = rightChild = NULL;}
binaryTreeNode(const T& theElement):element(theElement)
{
leftChild = rightChild = NULL;
}
binaryTreeNode(const T& theElement,
binaryTreeNode *theLeftChild,
binaryTreeNode *theRightChild)
:element(theElement)
{
leftChild = theLeftChild;
rightChild = theRightChild;
}
};

#endif

2. 定义二叉树类



#ifndef linkedBinaryTree_
#define linkedBinaryTree_

using namespace std;

#include <iostream>
#include "binaryTreeNode.h"


template<class E>
class linkedBinaryTree
{
public:
linkedBinaryTree()
{
root = NULL;
treeSize = 0;
}

bool empty() const
{
return treeSize == 0;
}
int size() const
{
return treeSize;
}

void makeTree(const E& element,
linkedBinaryTree<E>&, linkedBinaryTree<E>&);

void preOrder(void(*theVisit)(binaryTreeNode<E>*))
{
visit = theVisit;
preOrder(root);
}

void preOrderOutput()
{
preOrder(output);
cout << endl;
}


protected:
binaryTreeNode<E> *root; // pointer to root
int treeSize; // number of nodes in tree

static void (*visit)(binaryTreeNode<E>*); // visit function
static void preOrder(binaryTreeNode<E> *t);
static void output(binaryTreeNode<E> *t)
{
cout << t->element << " ";
}

};
//void (*linkedBinaryTree<int>::visit)(binaryTreeNode<int>*);

template<class E>
void linkedBinaryTree<E>::makeTree(const E& element,
linkedBinaryTree<E>& left, linkedBinaryTree<E>& right)
{
// Combine left, right, and element to make new tree.
// left, right, and this must be different trees.
// create combined tree
root = new binaryTreeNode<E> (element, left.root, right.root);
treeSize = left.treeSize + right.treeSize + 1;

// deny access from trees left and right
left.root = right.root = NULL;
left.treeSize = right.treeSize = 0;
}


template<class E>
void linkedBinaryTree<E>::preOrder(binaryTreeNode<E> *t)
{
// Previous order traversal.
if (t != NULL)
{
linkedBinaryTree::visit(t);
preOrder(t->leftChild);
preOrder(t->rightChild);
}
}

#endif


3. 测试二叉树

// test linked binary tree class

#include <iostream>
#include "linkedBinaryTree.h"

using namespace std;

int main(void)
{
linkedBinaryTree<int> a,x,y,z;
y.makeTree(1,a,a);
z.makeTree(2,a,a);
x.makeTree(3,y,z);
y.makeTree(4,x,a);
cout << "Number of nodes = ";
cout << y.size() << endl;

cout << "Preorder sequence is ";
y.preOrderOutput();

return 0;
}

...全文
642 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuyan505 2016-03-18
  • 打赏
  • 举报
回复
引用 5 楼 sdghchj 的回复:
[quote=引用 3 楼 xuyan505 的回复:] [quote=引用 1 楼 sdghchj 的回复:] visit是类的静态成员函数指针,类里声明,但还需要在类声明之外进行初始化吧,否则会被编译器过滤掉认为没有定义。 linkedBinaryTree<E>::visit = nullptr;
在类声明外进行初始化
linkedBinaryTree<E>::visit = nullptr;
由于使用了模板,编译器提示“ E was not declared in this cope" [/quote] 补充: 先在linkedBinaryTree里声明函数类型typedef void (*visitfun)(binaryTreeNode<E>*); 然后在类外 template<class E> typename linkedBinaryTree<E>::visitfun linkedBinaryTree<E>::visit = nullptr; [/quote] 这下可以了。谢谢您!
sdghchj 2016-03-18
  • 打赏
  • 举报
回复
引用 3 楼 xuyan505 的回复:
[quote=引用 1 楼 sdghchj 的回复:] visit是类的静态成员函数指针,类里声明,但还需要在类声明之外进行初始化吧,否则会被编译器过滤掉认为没有定义。 linkedBinaryTree<E>::visit = nullptr;
在类声明外进行初始化
linkedBinaryTree<E>::visit = nullptr;
由于使用了模板,编译器提示“ E was not declared in this cope" [/quote] 补充: 先在linkedBinaryTree里声明函数类型typedef void (*visitfun)(binaryTreeNode<E>*); 然后在类外 template<class E> typename linkedBinaryTree<E>::visitfun linkedBinaryTree<E>::visit = nullptr;
sdghchj 2016-03-18
  • 打赏
  • 举报
回复
引用 2 楼 xuyan505 的回复:
在类声明外进行初始化
linkedBinaryTree<E>::visit = nullptr;
由于使用了模板,编译器提示“ E was not declared in this cope"
template<class E> linkedBinaryTree<E>::visit = nullptr;
xuyan505 2016-03-18
  • 打赏
  • 举报
回复
引用 1 楼 sdghchj 的回复:
visit是类的静态成员函数指针,类里声明,但还需要在类声明之外进行初始化吧,否则会被编译器过滤掉认为没有定义。 linkedBinaryTree<E>::visit = nullptr;
在类声明外进行初始化
linkedBinaryTree<E>::visit = nullptr;
由于使用了模板,编译器提示“ E was not declared in this cope"
xuyan505 2016-03-18
  • 打赏
  • 举报
回复
在类声明外进行初始化
linkedBinaryTree<E>::visit = nullptr;
由于使用了模板,编译器提示“ E was not declared in this cope"
sdghchj 2016-03-18
  • 打赏
  • 举报
回复
visit是类的静态成员函数指针,类里声明,但还需要在类声明之外进行初始化吧,否则会被编译器过滤掉认为没有定义。 linkedBinaryTree<E>::visit = nullptr;

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧