2016-05-20 4 views
1

Я хочу передать указатель на функцию в классе, но он показывает ошибку и, честно говоря, я не знаю почему. Я внимательно следил за учебником, где написано так, но они не имеют проблем, пока я это делаю. Может ли кто-нибудь дать несколько советов? Я относительно новичок в C++. Заранее спасибо.Передача указателя на функцию C++

Если это помогает, здесь я создаю прототип словаря, здесь я пытаюсь читать из входных пар пар слов и сохранять их в связанном списке, поскольку я должен использовать его. Я использую программу Code :: Blocks.

#include <iostream> 
#include <fstream> 
#include <cmath> 
using namespace std; 
//------------------------------- 
struct node 
{ 
    string Language; 
    string English; 
    node* next; 
}; 
//------------------------------- 
class Dictionary //class where all functions will go 
{ 
public: 
    void readFirstElement(node *head, node *tail); 
    void readElements(node* head, node* tail); 
    // void insertElements(); 
    // void deleteElements(node* &head, node* &tail); 
//------------------------------- 
    void readFirstElement(node *head, node *tail) 
    { 
     string word1, word2; 
     node* temp; 
     ifstream input; 
     input.open("input.txt"); 
     input >> word1 >> word2; 
     temp=new node; 
     temp->Language=word1; 
     temp->English=word2; 
     temp->next=NULL; 
     cout << temp->Language <<" ir "<< temp->English << endl; 
     head=temp; 
     tail=temp; 

     input.close(); 
    } 
//------------------------------- 
    void readElements(node* &head, node* &tail) 
    { 
     string word1, word2; 
     node* temp; 
     ifstream input; 
     input.open("input.txt"); 
     while (!input.eof()) 
     { 
      input >> word1 >> word2; 
      temp=new node; 
      temp->Language = word1; 
      temp->English=word2; 
      tail->next=temp; 
      tail=temp; 
     } 
     tail->next=NULL; 
     input.close(); 
    } 
int main() 
{ 
    node* head = NULL; 
    node* tail = NULL; 
    Dictionary ob; 
    ob.readFirstElement(&head, &tail); 
    ob.readElements(&head, &tail); 
    node* temp = head; 
    return 0; 
} 

Основная ошибка это пишет ошибка: 'аннулируются словарь :: readFirstElement (узел *, узел *)' не может быть перегружен.

+0

Вам нужно поместить определения метода в файл реализации - в этом случае вы объявляете две пары методов с одинаковой сигнатурой в классе 'Dictionary', что является недопустимым. – ArchbishopOfBanterbury

ответ

0

Помещенный определения метода в файле .cpp реализации:

Dictionary.h

#ifndef DICTIONARY_H 
#define DICTIONARY_H 

class Dictionary { 
    public: 
     void readFirstElement(node* head, node* tail) const; 
     void readElements(node* head, node* tail) const; 
     //... 
}; 

#endif 

Dictionary.cpp

#include "Dictionary.h" 

void Dictionary::readFirstElement(node* head, node* tail) const { 
    //... 
} 

void Dictionary::readElements(node* head, node* tail) const { 
    //... 
} 

На данный момент вы объявляете две пары методов с той же подписью в Dictionary классе, который является недействительным.

+0

Большое спасибо. Я пока не знакомлюсь этим, но я попробую –

1

Это не имеет ничего общего с прохождением указателей. У вас была бы эта проблема независимо от аргументов, даже без аргументов.

Существует два способа определения функции-члена. Вы можете сделать это рядный, полностью в теле класса:

class X { 
    void foo() { 
     do_something(); 
    } 
}; 

Или вы можете просто поместить объявление его в теле класса, а затем поместить определение снаружи.

class X { 
    void foo(); 
}; 

void X::foo() { 
    do_something(); 
} 

То, что вы сделали это объявить свои функции в теле класса, а затем определить их по отдельности, а также в теле класса. Компилятор рассматривает это как две разные функции. Но поскольку они имеют одинаковые имена и типы аргументов, любая попытка их вызова была бы двусмысленной, и поэтому не допускается. Выберите один из вариантов, которые я показал выше.

+0

Спасибо! Теперь это намного яснее. Я исправил его, и программа запущена, за исключением того, что он говорит, что exe перестала работать. Я знаю, что функция readFirstElements работает, но можете ли вы увидеть серьезные ошибки с помощью ReadElements? Или я должен их объединить? –

+1

@ A.Black: Если у вас есть другой вопрос, сделайте еще одно сообщение. –