Dziedziczenie i zmienna dostępna również z klasy bazowej


(Kornicameister) #1

posiadam klasę abstrakcyjną która posiada wspólne metody dla reszty klas, których głównym zadaniem jest obsługa zapytań do baz danych.

w klasie bazowej posiadam listę stringów która zawierają w sobie listę kolumn jakie znajdują się w bazie danych.

Ta lista ma być możliwa do wypełnienia z poziomu każdej klasy, która dziedziczy (w domyśle jest to tylko jedna klasa, ta która obsługuje podłączanie się do bazy danych), ale potem i tak potrzebuję tej listy już wypełnionej dla każdej innej klasy obsługującej zapytanie

innymi słowy

wypełnienie listy z poziomu byle której klasy dziedziczącej ma dać efekt taki, że wypełniona lista jest już dostępna w reszcie klas dziedziczących

jak rozwiązać ten problem ?

statyczna zmienna ?


(Sawyer47) #2

Jeśli w każdym obiekcie klas pochodnych mają być te same dane to zmienna statyczna powinna się nadać.


(Kornicameister) #3

okej to będę kombinował

a teraz inny problem

wymyśliłem, że zapytanie select wykonuje tak, że składam takie zapytanie z części

  • nazwa kolumny

  • nazwa atrybutu

  • kryterium

i mam tablicę następującą

bool (* search_methods[4] ) (QString criterium,int table,int column);

gdzie indeksy tej tablicy to de-facto enumy

enum SearchMode {NORMAL = 0, BETWEEN = 1,BIGGER = 2,SMALLER = 3};

istnieje tylko jedna publiczna metoda zdefiniowana w klasie bazowej

bool QueryHandler::search(QString criterium,int table,int column,int search_mode){

    if(search_methods[search_mode](criterium,table,column)){

        return true;

    }

    return false;

}

i do tego są 4 prywatne, nie dziedziczone już metody, z których każda jest podpięta do odpowiedniej komórki tablicy w ten sposób

search_methods[NORMAL] = search_by_column;

, niestety te metody prywatne musiałem zadeklarować jako statyczne, bo inaczej kompilator czepiał mi się o brak argumentów

może tutaj po prostu popełniłem błąd ??

dlatego na razie nie rozwijam o co mi naprawdę chodzi, bo może te metody nie muszą być statyczne aby działać prawidłowo


(Sawyer47) #4

Mógłbyś rozwinąć?

Jeśli metoda jest statyczna to wskaźnik na nią ma typ R(*)(Args...) - tak jak zwykła funkcja, natomiast jeśli metoda jest niestatyczna to ma typ R(Klasa::*)(Args...), a to zupełnie różnego typu wskaźniki.


(Kornicameister) #5

jeśli te metody pojawią się zadeklarowane w klasie jako static tj.

static bool search_by_column(QString criterium,int table,int column);

to ten błąd się nie pojawia


(Sawyer47) #6

Dobrze, ale jaka była treść tego błędu? Mógłbyś dać jakiś minimalny kompletny kod, który by obrazował twój problem? Bo obecnie średnio rozumiem w czym masz problem.


(Kornicameister) #7

podałem go już wyżej

kiedy metoda, którą miałem wywoływać z tablicy wskaźników do funkcji, nie była zadeklarowana jako statyczna

to jest -> static bool search_by_column(QString criterium,int table,int column);

to nie pojawiał się następujący błąd kompilacji

natomiast jeśli deklarowałem ją jako metodą nie-static, to błąd (tu przytoczę go ponownie)

się pojawiał

inna sprawa to taka, że te metody muszę być statyczne ponieważ operują na dwóch statycznych zmiennych

operują w sensie takim, że

  • jednej ze zmiennych używam do przenoszenia komunikatów do wyświetlenia w głównym oknie programu

  • drugą zmienną statyczną jest nazwa połączenia z bazą danych, która musi być znana w każdej metodzie operującej na zapytaniach

  • powinny wywołać metody specyficzne dla zapisu konkretnych wyników zwrotnych z bazy danych (co jest kolejnym orzechem do zgryzienia)