wskaznik na niestatyczne funkcje klasy

0

Mam taki oto kod:

 
#include <iostream>

using namespace std;

class node
{
protected:
    struct Data{string name; string surname; int id;} data;
public:
    struct Data info()
    {
        cout<<"Name: \n";
        cin>>data.name;
        cout<<"Surname: \n";
        cin>>data.surname;
        cout<<"Id: \n";
        cin>>data.id;
        return data;
    };
    void displayInfo()
    {
        cout<<"Name: "<<data.name<<endl;
        cout<<"Surname: "<<data.surname<<endl;
    }

    int number;
    node *next;
};

bool isEmpty(node *head);
char menu();
void insertAsFirstElement(node *&head, node *&last, int number);
void insertl(node *&head, node *&last, int number);
void removel(node *&head, node *&last);
void showList(node *current);

bool isEmpty(node *head)
{
    if(head==NULL)
        return true;
    else
        return false;
}
char menu()
{
    char choice;

    cout<<"Menu\n";
    cout<<"1.Add an item\n";
    cout<<"2.Remove an item\n";
    cout<<"3.Show the list\n";
    cout<<"4.Exit\n";

    cin>>choice;
    return choice;
}
void insertAsFirstElement(node *&head, node *&last, int number)
{
    node *temp=new node;
    temp->number=number;
    temp->next=NULL;
    head=temp;
    last=temp;
}
void insertl(node *&head, node *&last, int number)
{
    if(isEmpty(head))
        insertAsFirstElement(head, last, number);
    else
    {
        node *temp=new node;
        temp->number=number;
        temp->next=NULL;
        last->next=temp;
        last=temp;
    }
}
void removel(node *&head, node *&last)
{
    if(isEmpty(head))
        cout<<"The list is already empty\n";
    else if(head==last)
    {
        delete head;
        head=NULL;
        last=NULL;
    }
    else
    {
        node *temp=head;
        head=head->next;
        delete temp;
    }
}
void showList(node *current)
{
    if(isEmpty(current))
        cout<<"The list is empty\n";
    else
    {
        cout<<"The list contains: \n";
        while(current!=NULL)
        {
            cout<<current->number<<endl;
            current=current->next;
        }
    }
}

int main()
{
    node *head=NULL;
    node *last=NULL;
    char choice;
    int number;

    do
    {
        choice=menu();
        switch(choice)
        {
        case '1':
        {
                cout<<"Enter the number\n";
                cin>>number;
                insertl(head,last,number);
                break;
        }
        case '2':
        {
            removel(head,last);
            break;
        }
        case '3':
        {
            showList(head);
            break;
        }
        default: cout<<"System exit\n";
        }
    }
    while(choice!='4');
    return 0;
}

I chcialbym stworzyc wskaznik na funkcje info() i displayInfo(), tak aby do funkcji listy np insertAsFirstElement, insertl i showList zamiast parametru number przeslac wskaznik na wyzej wymienione funkcje operujace na structie(aby mozna bylo tworzyc i wyswietlac dane o danym wezle) i nie wiem za bardzo jak sie za to zabrac, probowalem czegos takiego: struct data(node::*fptr)(struct data)=&node::info(); ale zdaje sobie sprawy, ze nie moge korzystac z tych metod gdyz sa niestatyczne(wiec ich adres tworzy sie dopiero wraz ze stworzeniem danego obiektu), czy cos takiego w ogóle mozna zrobic?

0

Pierwsze co, to ty odciąż te klase.

0
spartanPAGE napisał(a):

Pierwsze co, to ty odciąż te klase.

Nie rozumiem za bardzo o co chodzi

0

class node
{
protected:
    struct Data{string name; string surname; int id;} data; //przez to 2).
public:
    struct Data info(); //te funkcje chce zrobic jako pewien interfejs do pola sekcji protected 
    void displayInfo(); //
    int number; //do zastapienia 1).
    node *next;
};

struct node::Data node::info()
{
        cout<<"Name: \n";
        cin>>data.name;
        cout<<"Surname: \n";
        cin>>data.surname;
        cout<<"Id: \n";
        cin>>data.id;
        return data;
}

void node::displayInfo()
{
        cout<<"Name: "<<data.name<<endl;
        cout<<"Surname: "<<data.surname<<endl;
}


bool isEmpty(node *head);
char menu();
void insertAsFirstElement(node *&head, node *&last, int number);///tutaj
void insertl(node *&head, node *&last, int number);//i tutaj
void removel(node *&head, node *&last);
void showList(node *current);

bool isEmpty(node *head)
{
    if(head==NULL)
        return true;
    else
        return false;
}
char menu()
{
    char choice;

    cout<<"Menu\n";
    cout<<"1.Add an item\n";
    cout<<"2.Remove an item\n";
    cout<<"3.Show the list\n";
    cout<<"4.Exit\n";

    cin>>choice;
    return choice;
}
void insertAsFirstElement(node *&head, node *&last, int number)
{
    node *temp=new node;
    temp->number=number;
    temp->next=NULL;
    head=temp;
    last=temp;
}
void insertl(node *&head, node *&last, int number)
{
    if(isEmpty(head))
        insertAsFirstElement(head, last, number);
    else
    {
        node *temp=new node;
        temp->number=number;
        temp->next=NULL;
        last->next=temp;
        last=temp;
    }
}
void removel(node *&head, node *&last)
{
    if(isEmpty(head))
        cout<<"The list is already empty\n";
    else if(head==last)
    {
        delete head;
        head=NULL;
        last=NULL;
    }
    else
    {
        node *temp=head;
        head=head->next;
        delete temp;
    }
}
void showList(node *current)
{
    if(isEmpty(current))
        cout<<"The list is empty\n";
    else
    {
        cout<<"The list contains: \n";
        while(current!=NULL)
        {
            cout<<current->number<<endl;
            current=current->next;
        }
    }
}

int main()
{
    node *head=NULL;
    node *last=NULL;
    char choice;
    int number;

    do
    {
        choice=menu();
        switch(choice)
        {
        case '1':
        {
                cout<<"Enter the number\n";
                cin>>number;
                insertl(head,last,number);
                break;
        }
        case '2':
        {
            removel(head,last);
            break;
        }
        case '3':
        {
            showList(head);
            break;
        }
        default: cout<<"System exit\n";
        }
    }
    while(choice!='4');
    return 0;
}

 

Czy o to mniej wiecej Ci chodzilo?

0

Jest lepiej, ale musisz zrobic to z glowa - dla przykladu przeanalizuj standardowe kolekcje.
node::Data to potworek, ktory musisz zlikwidowac.
Przemysl zaleznosci i czy musisz numerowac i id-entyfikowac węzły.

0

to id w structie dalem tylko dlatego, bo nie mialem na razie wiekszego pomyslu co jeszcze moze sie tam znaleŹĆ,
generalnie chodzilo mi o to, zeby wszystkie pola znajdujace sie w klasie zgrupowac pod jednym aliasem tak aby dostawac sie do nich za pomoca tylko jednej funkcji, tak wiec jak bym tworzyl jakis nowy wezel w liscie to do funcji dodajacej wezel do listy przesylal bym wskaznik do tej funckji zamiast kazdy parametr(imie, wiek, wzrost itp.) z osobna, nie wiem czy takie rozwiazanie ma jednak sens

np. w funkcji insertl jest parametr number z poprzedniej wersji programu(teraz zamierzam go usunac tak aby znajdowal sie tam wskaznik do funckji inicjujacej pola protected klasy) ktory zamierzam zastapic

1

Coś strasznie przekombinowujesz lub nie potrafisz wytłumaczyć co chcesz zrobić.

Lista musi mieć prostą funkcjonalność. Mieszanie do tego jakiejś dodatkowej funkcjonalności związanej z tym co lista ma przechowywać bedzie zawsze problematyczne (niezrozumiałe).

Moja rada, opisz problem jaki próbujesz rozwiązać swoim programem, a nie opisuj jaki jest twój koncept rozwiązania tego problemu. Łatwiej będzie cie zrozumieć i zapewne się okaże, że poszedłeś zła drogą, której nie da się naprawić.
Doświadczenie uczy, że początkujący często nieświadomie kładą sobie kłody pod nogi i z prostego problemu potrafią zrobić coś skomplikowanego.

0

Dzieki za rade, ale to w takim razie jak moglbym to inaczej rozwiazac?

0

Opisać najpierw co chcesz rozwiązać.
Tak jak pisałem nie opisuj jak chcesz coś zrobić (wskaźnik na metodę po nie wiadomo co), ale napisz co ma robić twój kod.
Wtedy jest większa szansa, że zrozumiemy co chcesz osiągnąć i na czym polega twój problem.

BTW czemu tworzysz własną listę, a nie używasz gotowca std::list?

1 użytkowników online, w tym zalogowanych: 0, gości: 1