初学者求问:0x77D4BDA1 处有未经处理的错误(在 10.8.exe 中): 0xC0000005: 执行位置 0x00000000 时发生访问冲突

菜鸟求问:0x77D4BDA1 处有未经处理的异常(在 10.8.exe 中): 0xC0000005: 执行位置 0x00000000 时发生访问冲突。
C++ primer plus 10.8编程练习:
代码如下:

头文件:
#ifndef LIST_H
#define LIST_H
typedef int Item;

class List{
private:
enum{MAX=10};
Item items[MAX];
int top;
public:
List();
bool isempty()const;
bool isfull()const;
bool push(const Item & item);
bool pop( Item & item);
void visit(void(*pf)(Item & item));
};
#endif


函数定义:
#include<iostream>
#include"list.h"

List::List(){
top = 0;
items[MAX] = {};
}

bool List::isempty()const{
return top == 0;
}

bool List::isfull()const{
return top == MAX;
}

bool List::push(const Item & item)
{
if (top<MAX)
{
this->items[++top] = item; return true;
}
else {
std::cout << "The stack is full.\n"; return false;
}
}

bool List::pop( Item & item){

if (top>0)
{
item=this->items[top--] ; return true;
}
else {
std::cout << "The stack is empty.\n"; return false;
}
}

void List::visit(void(*pf)(Item & item)){
if (this->isempty())std::cout << "The stack is empty.\n";
else{
for (int i = 0; i < MAX; i++)
(*pf)(this->items[i]);
}
}

void  revalue1(Item item)
{
std::cout << "The value of REVALUE1 is " << item*0.5;
}

void revalue2(Item item)
{
std::cout << "The value of REVALUE2 is " << item*0.7;
}

 void show(Item item)
{
std::cout << "Item is " << item<<std::endl;
}

主函数:
#include<iostream>
#include"list.h"
void (*revalue1)(Item &);
void (*revalue2)(Item &);
void(*show)(Item &);
int main(){
List m;
Item input[] = { 23, 10, 25, 40, 50 };
for (int i = 0; i < 5; i++)
m.push(input[i]);

std::cout << "The stack have " << std::endl;
m.visit(show);

std::cout << "REVALUE1:\n";
 m.visit(revalue1);
 m.visit(show);

std::cout << "REVALUE2:\n";
m.visit(revalue2);
m.visit(show);
//for (int i = 0; i < 5; i++)
//std::cout << "The stack have " << m.pop(input[i]) << std::endl;
return 0;
}


在调试时出现了标题所示的错误,发现是类对象调用外部函数时出现错误,即下述代码:
void List::visit(void(*pf)(Item & item)){
if (this->isempty())std::cout << "The stack is empty.\n";
else{
for (int i = 0; i < MAX; i++)
(*pf)(this->items[i]);
}
}


求大侠帮忙解答!在线等!不甚感激!
------解决思路----------------------
main.cpp中定义了函数指针,但是没有函数啊.
把函数拿出来定义,向这样
void  revalue1(Item& item)
{
    std::cout << "The value of REVALUE1 is " << item*0.5;
}

void revalue2(Item& item)
{
    std::cout << "The value of REVALUE2 is " << item*0.7;
}
void show(Item& item)
{
    std::cout << "Item is " << item<<std::endl;
}
int main()
{
    List m;
    Item input[] = { 23, 10, 25, 40, 50 };
    for (int i = 0; i < 5; i++)
        m.push(input[i]);

    std::cout << "The stack have " << std::endl;
    m.visit(show);

    std::cout << "REVALUE1:\n";
    m.visit(revalue1);
    m.visit(show);

    std::cout << "REVALUE2:\n";
    m.visit(revalue2);
    m.visit(show);
//for (int i = 0; i < 5; i++)
//std::cout << "The stack have " << m.pop(input[i]) << std::endl;
    return 0;
}