• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Obiektowe wskaźnik na funkcje (C++)

0 głosów
729 wizyt
pytanie zadane 25 czerwca 2018 w C i C++ przez Sic Dyskutant (8,510 p.)

Podczas robienia zadania natchnąłem się na problem ze wskaźnikiem funkcji nie wiem dlaczego nie dzieła i jaki jest w tym zawarty błąd:

plik nagłówkowy:

#ifndef LIST_H_
#define LIST_H_

typedef int Item;
class List
{
        private:
                enum { Max = 10 };
                Item items[Max];
                int top=0;
        public:
                List();
                bool isempty() const;
                void * up_value_top (Item & item);
                void visit(void (*do_something) (Item &));
};

#endif

main:

#include "list.h"
#include <iostream>
#include <cctype>

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

void * List::up_value_top (Item & item) { 
        bool one = true;
        bool zero = false;
        if(top < Max) 
        {       items[top++] = item; 
                std::cout << one << std::endl; 
        }
        else
                std::cout << zero << std::endl;} 

void List::visit(void (*do_something) (Item & item)) // ??? 
{       for(int i=0; i<Max; i++)
                std::cout << top++ << " element listy: " << items[i] << std::endl; 
}

int main()
{
        List check_list;
        int number;
        char letter;
        std::cout << "Sprawdzanie list, wybierz opcje:\n1. Dodaj element\n2. Zawartość listy\n3. Koniec sprawdzania\n\n";
        while(std::cin >> letter && isalpha(letter))
        {
                switch(letter)
                {
                        case '1':
                                check_list.up_value_top(number);
                                check_list.visit(check_list.up_value_top(number));
                        break;
                        case '2':
                                if(check_list.isempty())
                                        std::cout << "Stos pusty!\n";
                                else
                                        check_list.visit(up_value_top(number));
                        break;
                        case '3':
                        break;
                }//switch
        }//while
        std::cout << "Zakończenie programu\n";
}//main

Błędy (próbowałem poprawiać, ale tworzą się nowe)

list.cpp:35:45: error: invalid conversion from ‘void*’ to ‘void (*)(Item&) {aka void (*)(int&)}’ [-fpermissive]
     check_list.visit(check_list.up_value_top(number));
                      ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~
list.cpp:18:6: note:   initializing argument 1 of ‘void List::visit(void (*)(Item&))’
 void List::visit(void (*do_something) (Item & item)) // ???
      ^~~~
list.cpp:41:23: error: ‘up_value_top’ was not declared in this scope
      check_list.visit(up_value_top(number));

 

2 odpowiedzi

+1 głos
odpowiedź 25 czerwca 2018 przez Hiskiel Pasjonat (22,830 p.)
wybrane 25 czerwca 2018 przez Sic
 
Najlepsza

list.cpp:35:45: error: invalid conversion from ‘void*’ to ‘void (*)(Item&) {aka void (*)(int&)}’ [-fpermissive]

     check_list.visit(check_list.up_value_top(number));

check_list.visit() oczekuje  void (*) (Item &item) a dostaje void*.

list.cpp:41:23: error: ‘up_value_top’ was not declared in this scope

      check_list.visit(up_value_top(number));

Tutaj zwracasz chcesz wywołać metodę klasy List, jednakże zapomniałeś sprecyzować o którą instancję Ci chodzi, więc kompilator myśli, że to jakaś funkcja, której tak naprawdę nie ma. Nie powinno być check_list.up_value_top() ?

1
komentarz 25 czerwca 2018 przez Sic Dyskutant (8,510 p.)
przywrócone 25 czerwca 2018 przez Sic
Tak powinno, ale po zmianiach zapomiałem dodać. Dziękuję poprawie to zaraz
1
komentarz 25 czerwca 2018 przez Hiskiel Pasjonat (22,830 p.)
Nie ma sprawy
1
komentarz 25 czerwca 2018 przez Sic Dyskutant (8,510 p.)
void (*List::up_value_top) (Item & item) { 
        if(top < Max) 
        {       items[top++] = item; 
                std::cout << true << std::endl; 
        }
        else
                std::cout << false << std::endl;} 

W tej funkcji jest błąd, jednak przejrzałem całość zmieniłem wartości bool(w nich też występował) i nie wiem co może być nie tak.

list.cpp:8:40: error: ‘void (* List::up_value_top)(Item&)’ is not a static data member of ‘class List’
 void (*List::up_value_top) (Item & item) {
                                        ^
list.cpp:9:2: error: expected primary-expression before ‘if’
  if(top < Max)
  ^~
list.cpp:9:2: error: expected ‘}’ before ‘if’
list.cpp:13:2: error: expected unqualified-id before ‘else’
  else
  ^~~~
list.cpp:14:35: error: expected declaration before ‘}’ token
   std::cout << false << std::endl;}

 

1
komentarz 25 czerwca 2018 przez Hiskiel Pasjonat (22,830 p.)

Problem leży tutaj tylko w 

list.cpp:8:40: error: ‘void (* List::up_value_top)(Item&)’ is not a static data member of ‘class List’

 void (*List::up_value_top) (Item & item) {

Dlaczego z void* zrobiłeś void (*List::up_value_top)  ?

1
komentarz 25 czerwca 2018 przez Sic Dyskutant (8,510 p.)
Błędem było:

void * List::...

Skoro funkcja oczekiwała: void (*)(int &), to poprawiłem na void (*List::...)..

wydawało mi się, że to jest poprawna wersja.
1
komentarz 25 czerwca 2018 przez Hiskiel Pasjonat (22,830 p.)

Myślę, że zmiana z

void List::visit(void(*)(Item&))

na

void List::visit()

w zupełności wystarczy :P. Przecież nawet nie wykorzystujesz tego argumentu w ciele funkcji.

1
komentarz 25 czerwca 2018 przez Sic Dyskutant (8,510 p.)
Zmiłem to pomogło, jednak program nie działa jak należy. Zmieniłem warunek switcha na:

std::cin>> letter && letter != '3'

W dodatku po wpisaniu 1 i 2 dzieje się to samo, dlaczego skoro obie mają robić zupełnie co innego?
1
komentarz 25 czerwca 2018 przez Hiskiel Pasjonat (22,830 p.)
Myślę, że wystarczy cin>>letter && isdigit(letter) a w switchu w case '3' inicjalizuj letter wartością np. 'a',  wtedy automatycznie wyjdzie z pętli.
1
komentarz 25 czerwca 2018 przez Sic Dyskutant (8,510 p.)

@Hiskiel, Już znalazłem rozwiązanie dziękuję bardzo za pomoc.

1
komentarz 25 czerwca 2018 przez Hiskiel Pasjonat (22,830 p.)
Cieszę się, że mogłem pomóc.
+1 głos
odpowiedź 25 czerwca 2018 przez Olek2 Nowicjusz (160 p.)
Dziękuję za ten wątek. Bardzo mi się przydał.

Podobne pytania

0 głosów
2 odpowiedzi 1,515 wizyt
pytanie zadane 11 kwietnia 2018 w C i C++ przez antek782 Początkujący (490 p.)
0 głosów
1 odpowiedź 948 wizyt
pytanie zadane 21 stycznia 2019 w C i C++ przez AuriattaDev Początkujący (390 p.)
0 głosów
1 odpowiedź 795 wizyt
pytanie zadane 26 maja 2018 w C i C++ przez Sic Dyskutant (8,510 p.)

93,772 zapytań

142,730 odpowiedzi

323,382 komentarzy

63,368 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...