Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

c++ qt deklaracja obiektu w klasie nadrzednej klasy podrzednej zasięg widoczność

Ostatnio zmodyfikowano 2016-04-28 18:20
Autor Wiadomość
michal11
» 2016-04-27 18:26:02
W klasie A nie ustawiasz wskaźnika bobject więc w funkcji test2 jest wywoływana funkcja na rzecz nieistniejącego obiektu. Swoją droga dziwne, że w debug działa, na pewno to jest cały kod ? co się wyświetla ? Jaki błąd dostajesz w release ?
P-147730
alien1983
Temat założony przez niniejszego użytkownika
» 2016-04-27 18:53:40
nazwa sygnału: SIGSEGV
znaczenie sygnału: Segmentation fault

0x401fce                   8b 4e 08              mov    0x8(%esi),%ecx


Jak zrobić stabilne te obiekty?
 aby można było się do nich odwołać?

Jeżeli zamiast

C * cobject;
użyje
C cobject;

to się borykam

z poniższymi błędami dla klas
c.h:6: błąd: expected class-name before '{' token
 {
 ^
P-147731
michal11
» 2016-04-27 19:58:33
Bo próbujesz zrobić jakąś dziwną konstrukcję z klasą bazowa zawierającą klasy dziedziczące, po co ci w ogóle coś takiego ?
P-147734
alien1983
Temat założony przez niniejszego użytkownika
» 2016-04-27 20:30:02
tak mi doradzili aby zrobić dziedziczenie klas...

klasa A czyli rdzeń (główna klasa przetwarzająca, inicjująca to co dzieje się w programie)
klasa B np. obsługuje połączenia websocket
klasa C obsługuje bazę danych
klasa D obsługuje terminal , wyświetla informacje z aplikacji (ile połączeń do bazy, użytkowników, obciążenie serwera itp.)

klasa A potrzebuje komunikować się ze wszystkimi klasami.
klasa B potrzebuje komunikować się z klasa C i D
klasa C z klasą D

itp.
a potem przejdę do wątków
i połączenia wielowątkowych połączeń z serwerem i komunikacji z np. jednowątkową obsługą terminala ...


P-147735
michal11
» 2016-04-27 21:36:10
Nie wiem dlaczego niby klasa obsługująca terminal miałaby dziedziczyć z klasy rdzenia (czyli miałaby zachodzić relacja IS-A). Do tego co napisałeś wystarczy zwykła zawieranie (components), zdecydowanie nie nadaje się do tego dziedziczenie (nawet nie wiem jak by taka hierarchia miała wyglądać, co miało by być dziedziczone).
P-147736
mateczek
» 2016-04-27 21:45:49
jeśli już to chyba w druga stronę od obiektu mniej szczegółowego do obiektu bardziej rozbudowanego :P Jak dziedziczysz to nie potrzebujesz składowych obiektów Bo jeśli klasa B z dziedziczy po A to już ma wszystkie składniki klasy A :P

trzy klasy: zwierze, ptak, pies.

ptak dziedzyczy po zwierze.
pies dziedziczy po zwierze.

ale pies po ptak już średnio :) bo gdyby tak było to pies by latał bez kopnięcia w dupę :P a to trochę średnio
P-147737
alien1983
Temat założony przez niniejszego użytkownika
» 2016-04-27 22:09:59
Ok.

Mogę zawsze nie dziedziczyć i tworzyć dla np. klasy Terminal (co używa klasy qDebug) w każdej swojej klasie stworzyć nowy obiekt terminal objektTerminal, tak to mogę to używać. Ale dla wyświetlania napisów na jednym ekranie tworze tyle obiektów(instancji)ile jest klas chcących coś zakomunikować. 

Pytanie?
To jak zrobić tak jak jest w QT
>> qDebug()
, że nie muszę za każdym razem tworzyć obiektu w każdej klasie qDebug aby użyć metody qDebug() ?
tylko dodaje nagłówek klasy i tyle?

Moje podejście jest trochę z Delphi a C++ mamy klasy. 

Główna procedura(zbiór funkcji inicjujących sterujących itp. programem)

 >> (podprogram realizujący) - połączenia websocket
    (podprogram realizujący) - połączenia sql
    (podprogram realizujący) - połączenia terminal
    (podprogram realizujący) - cokolwiek innego

?
P-147738
mateczek
» 2016-04-28 00:08:14
Moje podejście jest trochę z Delphi a C++ mamy klasy.


akurat tutaj to delphi się bardzo od c++ nie różni. W Delphi też są obiekty i klasy. A, że pisząc program pewnie używałeś jednej (klasa okna głównego), której składnikami były przyciski, labelki itp. to już inna rzecz :P 

C/C++
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class( TForm ) // klasa okna głównego
Edit2
    : TEdit;
Button1: TButton; // składniki klasy
Label1: TLabel; // składniki klasy
Label2: TLabel;
Edit1: TEdit;
Label3: TLabel;
procedure Button1Click( Sender: TObject );
function F( n: integer )
    : integer; //metody klasy
private

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{ $ R *.dfm }

function TForm1.F( n: integer )
    : integer;
begin
if n = 1 then
begin
F:= 1;
exit
end;
if n = 2 then
begin
F:= 1;
exit
end;
F:= F( n - 2 ) + F( n - 1 )
     end;

procedure TForm1.Button1Click( Sender: TObject );
var n: integer;
begin
n:= strtoint( edit1.Text );
edit2.Text:= inttostr( F( n ) )
end;


end.

Do dziedziczenia widać jeszcze w Delphi nie doszedłeś. Ale działa tak samo jak w C++

Oczywiście są różnice między tymi językami:
C++ mamy szablony w delphi nie
c++11 daje duże udogodnienia (fajne pętle, auto, wyrażenia lambda)
c++ ma wiele bibliotek z których korzystanie jest wygodniejsze (boost, stl, qt)
Ale sama obiektowość delphi c++ to prawie to samo.

Z ciekawostek biblioteka VCL używana między innymi w C++ builder jest napisana w pascalu (delphi)
A projekt delphi na linuxa (kylix) korzystał z biblioteki QT


reasumując. Możesz pisać program tak samo jak to robiłeś w Delphi i będzie dobrze !!!
P-147741
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona