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

Wskaźnik do tablicy funkcji

Object Storage Arubacloud
0 głosów
234 wizyt
pytanie zadane 29 kwietnia 2021 w C i C++ przez grzecho123 Początkujący (450 p.)

Posiadam taki kod

main.cpp

#include <iostream>
#include "complex.h"
#include <math.h>

using namespace std;

int main()
{
    Complex c1(3,5);
    Complex c2(2,7);

    cout<<c1.tab_wsk_fun[3]<<endl;
    cout<<c1.fun3()<<endl;
    cout<<c1.fun4()<<endl;
    return 0;
}

complex.cpp

#include <iostream>
#include "complex.h"
#include <math.h>


using namespace std;

Complex::Complex()
{
    re=0;
    im=0;
    tab_wsk_fun[0]=&Complex::fun1;
    tab_wsk_fun[1]=&Complex::fun2;
    tab_wsk_fun[2]=&Complex::fun3;
    tab_wsk_fun[3]=&Complex::fun4;
}

Complex::Complex(double rze)
{
    re=rze;
    im=0;
    tab_wsk_fun[0]=&Complex::fun1;
    tab_wsk_fun[1]=&Complex::fun2;
    tab_wsk_fun[2]=&Complex::fun3;
    tab_wsk_fun[3]=&Complex::fun4;
}

Complex::Complex(double rze, double ur)
{
    re=rze;
    im=ur;
    tab_wsk_fun[0]=&Complex::fun1;
    tab_wsk_fun[1]=&Complex::fun2;
    tab_wsk_fun[2]=&Complex::fun3;
    tab_wsk_fun[3]=&Complex::fun4;
}

double Complex::fun1()
{
    return re;
}

double Complex::fun2()
{
    return im;
}

double Complex::fun3()
{
    return (re*re+im*im);
}

double Complex::fun4()
{
    return (sqrt(re*re+im*im));
}

complex.h

#include <iostream>


using namespace std;

class Complex
{
    double re, im;


public:
    double ( Complex::*tab_wsk_fun[4])();
    Complex();
    Complex(double);
    Complex(double, double);

    double fun1();
    double fun2();
    double fun3();
    double fun4();

};

Chciałbym w main wyświetlic wartość na jaką wskazuje wskaźnik np. tab_wsk_fun[3] ale cały czas mi wypisuje 1 i nie wiem gdzie mam błąd. W jaki sposób moge wypisac to co siedzi pod wskaźnikiem tab_wsk_fun? Muszę przeładować << czy w jakiś inny sposób?

komentarz 29 kwietnia 2021 przez Oscar Nałogowiec (29,290 p.)
Spróbuj zrzutować na void *.
komentarz 29 kwietnia 2021 przez grzecho123 Początkujący (450 p.)
Mógłbyś mi napisać jak to zrobić
komentarz 29 kwietnia 2021 przez Oscar Nałogowiec (29,290 p.)
    cout<<reinterpret_cast<void *>(c1.tab_wsk_fun[3])<<endl;

albo po staremu

    cout<<(void *)(c1.tab_wsk_fun[3])<<endl;

 

komentarz 29 kwietnia 2021 przez grzecho123 Początkujący (450 p.)
Wypisuje mi adres komórki zamiast wartości
komentarz 29 kwietnia 2021 przez tkz Nałogowiec (42,000 p.)
W jaki sposób funkcja ma przechowywać wartość? Co najwyżej możesz zwrócić wartość jaką obliczy. Ale do tego potrzebujesz "zwykłej" tablicy wartości.
komentarz 29 kwietnia 2021 przez Oscar Nałogowiec (29,290 p.)
A po co chcesz widzeć zawartość pamięci - tam będzie jakiś wykonywalny kod binarny. W dodatku może być podobny dla różnych funkcji to na początku będzie prefix funkcji - jakieś zabawy ze stosem.
komentarz 30 kwietnia 2021 przez grzecho123 Początkujący (450 p.)
edycja 30 kwietnia 2021 przez grzecho123
@tkz, No to po co tworzyc wskaźniki do funkcji? Jakie jest ich zadanie skoro tej funkcji nie wywołają ani nic nie zwrócą. Bo np. funkcja coś zwraca (lub jest voidem) jak się ją wywoła, a tu dlaczego nie mogę wywołać funkcji poprzez wskaźnik?

Ja rozumiem to tak, że jak są wskaźniki do zmiennych to mogę wyłuskać wartość tej zmiennej a tu co moge zrobić?
komentarz 30 kwietnia 2021 przez tkz Nałogowiec (42,000 p.)
#include <iostream>
 
 
using namespace std;
 
class Complex
{
      double re, im;

 
public:
     double fun1();
     double fun2();
     double fun3();
     double fun4();
    Complex();
    Complex(double);
    Complex(double, double);
};

#include <iostream>
#include <math.h>
 
 
using namespace std;
 
Complex::Complex()
{
    re=0;
    im=0;
}
 
Complex::Complex(double rze)
{
    re=rze;
    im=0;
}
 
Complex::Complex(double rze, double ur)
{
    re=rze;
    im=ur;
}
 
double Complex::fun1()
{
    return re;
}
 
double Complex::fun2()
{
    return im;
}
 
double Complex::fun3()
{
    return (re*re+im*im);
}
 
double Complex::fun4()
{
    return (sqrt(re*re+im*im));
}

#include <iostream>
#include <math.h>
 
using namespace std;
 
int main()
{
    double (Complex::*tab_wsk_fun[4])()= { &Complex::fun1, &Complex::fun2,&Complex::fun3,&Complex::fun4};
    Complex c1(3,5);
    cout<<(c1.*tab_wsk_fun[0])()<<endl;
    return 0;
}

Można to zrobić lepiej korzystając z nowszych rozwiązań, które są w standardzie. 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 391 wizyt
pytanie zadane 15 marca 2017 w C i C++ przez Evelek Nałogowiec (28,960 p.)
+1 głos
1 odpowiedź 467 wizyt
pytanie zadane 28 maja 2016 w C i C++ przez komo23 Nowicjusz (130 p.)
0 głosów
3 odpowiedzi 1,023 wizyt
pytanie zadane 23 grudnia 2015 w C i C++ przez niezalogowany

92,555 zapytań

141,404 odpowiedzi

319,557 komentarzy

61,940 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...