Kilka pytań dotyczących konstruktora klasy - sekcja private

0

Witam. Taka sytuacja. Jest klasa Connection, która dziedziczy po QTcpSocket. W klasie serwera mam taką metodę, dodającą nowe połączenie (klienta)

void Server::addClient() {
    Connection * connection = static_cast<Connection*>(socket->nextPendingConnection()); //Konwersja z QTcpSocket* do Connection*
    connection->setID(maxID); 
    
   //jakies dodawanie do tablicy <Connection*> i inne
    
    maxID++;
}

JAk widać, nigdzie nie wywołuję konstruktora klasy Connection (nigdzie nie tworzę jej egzemplarza, a jedynie konwertuję do jej postaci). Czy w związku z tym warto dać konstrutkor tej klasy do bloku private żeby ktoś przypadkiem nie stworzył jej egzemplarza? Czy da się wywołać jakoś ten konstruktor po takiej konwersji? Czy dobrze jest to pomyślane? W zamiarze, ma być tak że ten obiekt connection jest jakby klientem przychodzącym, rozszerza on klasę QTcpSocket o jakieś pola i metody (tutaj o ID klienta).

0

Na moje oko to powinienes wydziedziczyc dodawana funkcjonalnosc, opakowac ja w jakis interfejs, zrobic aby te dwie klasy implementowaly ow interfejs, a nastepnie zapomniec o cast

Teraz dopiero zauwazylem, ze Connection dziedziczy po klasie wbudowanej w Qt. W kazdym razie, kod jest unsafe, bo ten cast nie sluzy do rzutowania w dol. Jak mozesz to przedefiniuj ta metode, ktora zwraca QTcpSocket, tak aby zwracala Connection.

0

Nie mogę. Ta metoda jest z biblioteki Qt. Nawet jakbym zmienił w tej bibliotece klasę QTcpSocket tak żeby zwracała Connection* to co gdy zechcę kod skompilować, np. pod Windowsem, albo po reinstalu? Musiałbym cały czas to zmieniać co wiadomo mija się z celem. Kod ten działa, tylko właśnie się zastanawiam czy optymalnie.

PS. Tu chyba jest rzutowanie w dół

QTcpSocket
^
|
|
|
Connection

Z QTcpSocket do Connection. Czyli powinno być wszystko safe, bo konwertuję teoretycznie z obiektu "mniejszego" do "wiekszego" i mogę wykonać każdą metodę z QTcpSocket + te z Connection

Sry, też nie doczytałem. Faktycznie powinien być dynamic_cast (teoretycznie). Z tym że ze static wszystko działało a z dynamic mam naruszenie ochrony pamięci :(

0

Tak na dobra sprawe, to trzeba by bylo zamknac w jakiejs abstrakcji korzystanie z obiektow czysto Qtowych, popisac wrappery, zeby byly przystosowane do Twojej architektury. Edycje klas sie robi przez koncepcje OOPu, tzn. dziedzieczenie, bla bla.

1

To co tam robisz to jest undefined behavior. Takie rzutowanie działa tylko, jeżeli wskaźnik na klasę bazową tak naprawdę pokazuje na obiekt klasy pochodnej. U Ciebie tak nie jest i dynamic_cast też na to nie pomoże.

1

Więc chyba w tym przypadku najlepiej odpuścić dziedziczenie i zamknąć socket w obiekcie klasy Connection. Coś w tym stylu:

class Connection : public QObject {
   private:
   QTcpSocket * socket;
   unsinged ID;
   //inne dane klienta
}

?

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