2016-11-23 28 views
0

请帮助我... 我有Student类,LinkedList类和struct Node。我想要获得学生的(对象)名称,我有这么多的错误。我不知道调用函数的typedef。通过链表类中的另一个类调用函数

有我的代码:

#include <iostream> 
#include <string> 

using namespace std; 

class Student{ 
public: 
string name; 
int age; 
Student(string n, int a){ 
    name = n; 
    age = a; 
} 
Student(){}; 

void showname(){ 
    cout << "My name is: " << name << endl; 
} 

void showage(){ 
    cout << "My age is: " << age << endl; 
} 
}; 

template<class T>struct Node{ 
    T value; 
    Node<T>* next; 
}; 

template<class T>class LinkedList{ 
     typedef void (T::*fn)(); 
    public: 
     Node<T>* first; 
     Node<T>* temp; 
     LinkedList(){ 
      first = NULL; 
     } 

    void insert(T a2){ 
     Node<T>* new_node = new Node<T>; 
     new_node->value = a2; 
     new_node->next = first; 
     first = new_node; 
    } 

    void call(T b, fn op){ 
     (b.*op)(); 
    } 

    void show(){ 
     temp = first; 
     while(temp!=NULL){ 
      cout << temp->value; 
      temp = temp->next; 
     } 
     cout << endl; 
    } 
}; 

int main(){ 
    Student s1("Nurbolat", 18); 
    int a = 1; 
    LinkedList<int> l1; 
    LinkedList<Student> l2; 
    l2.call(s1, &Student::showname); 
    l2.call(s1, &Student::showage); 
    return 0; 
} 

回答

2
typedef void (T::*fn)(); 

创建别名fn作为T类型的成员函数,不接收参数和返回void

由于int是简单类型,它不”没有任何成员函数。

这不是必需的,但它允许实例化所有成员函数LinkedList,然后LinkedList<int>可能会给出错误。

删除的typedef并替换:

void call(T b, fn op){ 
    (b.*op)(); 
} 

有:

template <typename F> 
void call(T b, F op){ 
    (b.*op)(); 
} 

,那么它应该工作

+0

它的工作。非常感谢你) –