PDA

Visualizza la versione completa : [C++] Teoria


misterx
25-07-2018, 20:32
Sto ripassando/studiando C++ ed ho notato che, nonostante tutto, sono riuscito per molto tempo a sviluppare software senza creare classi mie ma sfruttando sempre quelle presenti nell'ambiente di sviluppo che uso ed in quanto, arrivando dal C, ho sempre creato programmi misti C/C++.
Ora è giunto il momento di usare C++ e mi sono arenato sul significato ad esempio della dichiarazione delle classe qui sotto.
Da quello che ho capito:

class TMyThread : public TThread
questa dichiarazione serve per derivare la classe TThread cioè, TMyThread eredita i metodi e le proprietà di TThread

System::String FMsg;
Rispetto agli esempi che trovo in rete anche su HTML.IT in merito alla dichiarazione di classi, dovrebbe esistere, nel mio ambiente di sviluppo, almeno così ho capito, un oggetto/classe System che fa qualcosa ma per le mie conoscenze, Scrivere System::String mi confonde in quanto, String per me è un tipo di dato e notoriamente, quella scrittura coi :: non dovrebbe dichiarare un metodo?
Oppure quella scrittura aggiunge semplicemente una proprietà String alla classe System definita nell'ambiente di sviluppo?

Per ora mi fermo qua ed attendo che mi rispondiate, prima di scrivere altre castronate.




class TMyThread : public TThread
{
private:
System::String FMsg;
TServerSocket *FServer;
void __fastcall SendMyMessage();
protected:
void __fastcall Execute();
public:
__fastcall TMyThread(TServerSocket *AServer, const System::String &AMsg);
};

shodan
25-07-2018, 21:01
Il :: può essere usato anche per indicare un namespace oltre che per le classi.
Nel tuo caso (C++ Builder se non erro) esiste un namespace System con al suo interno una classe String.

misterx
26-07-2018, 06:53
grazie shodan,
dopo che hai detto namespace ho iniziato lo studio ed altro dubbio è il seguente: un conto è definirne uno proprio e risulta chiaro, ma un altro è usarne uno implementato dove la sua implementazione non è visibile almeno, io ho solo l'help in linea a disposizione.
A quanto ho capito, di l'oggetto String molto probabilmente è usato in diversi namespace ed a scopi differenti, altrimenti non si giustifica l'uso di appartenenza a System.

shodan
27-07-2018, 14:42
A quanto ho capito, di l'oggetto String molto probabilmente è usato in diversi namespace ed a scopi differenti, altrimenti non si giustifica l'uso di appartenenza a System.

Il namespace di per se evita ambiguità. Nessuno ti vieta di creare una tua implementazione di String e usare un namespace diverso, una persona terza magari fornisce la sua implementazione e la mette in un namespace diverso. Per farla breve puoi pensare al namespace come una "specie" di cognome che evita omonimie (e se non basta se ne aggiunge un altro e così via).

misterx
27-07-2018, 19:35
grazie shodan, molto chiaro.

Secondo voi, perchè la seguente dichiarazione



class TMyThread : public TThread
{
protected:
void __fastcall Execute();
public:
__fastcall TMyThread();
void __fastcall TMyThread::MySincrSock1();
void __fastcall TMyThread::MySincrSock2();
};


produce le seguenti segnalazioni:

'_fastcall TMyThread::MySincrSock1()' is not a member of 'TMyThread'
'_fastcall TMyThread::MySincrSock2()' is not a member of 'TMyThread'

a me sembra tutto regolare

shodan
27-07-2018, 21:40
Togli il TMyThread:: davanti alle funzioni della classe.

misterx
28-07-2018, 17:50
grazie 1000

misterx
01-08-2018, 17:38
in questo pseudo codice in formato Borland Builder non mi spiego alcune cose.
Dichiaro due thread e li istanzio. Poi uso il metodo Syncronize() per evitare collisioni con la UI per inviare messaggi su socket. Effettivamente funziona, ma quale dei due thread invia i messaggi?
Questo non mi è chiaro.
Visto così, ho creato due thread gemelli che fanno la medesima cosa: sbaglio?



class TMyThread : public TThread
{
protected:
void __fastcall Execute();
public:
__fastcall TMyThread();
void __fastcall MySincrSock1();
void __fastcall MySincrSock2();
};

TMyThread *Thread1 = NULL;
TMyThread *Thread2 = NULL;


void __fastcall TForm1::Button1Click(TObject *Sender)
{
Thread1 = new TMyThread();
Thread2 = new TMyThread();
}


void __fastcall TMyThread::Execute()
{
while (!Terminated)
{
Synchronize(&MySincrSock1);
Sleep(200);
Synchronize(&MySincrSock2);
Sleep(200);
}
}

void __fastcall TMyThread::MySincrSock1()
{
if(Form1->ServerSocket1->Socket->ActiveConnections>0)
Form1->ServerSocket1->Socket->Connections[0]->SendText("aabbccdd");
}


void __fastcall TMyThread::MySincrSock2()
{
if(Form1->ServerSocket2->Socket->ActiveConnections>0)
Form1->ServerSocket2->Socket->Connections[0]->SendText("eeffgghh");
}
//---------------------------------------------------------------------------

shodan
01-08-2018, 18:15
Teoricamente nessuno dei due. Anzi dovrebbe darti errore dato che MySyncrSock1 e 2 sono dichiarate ma non definite (hai riportato male il codice?).

misterx
01-08-2018, 18:31
si, errore mio: ho sistemato

Loading