Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 14 su 14
  1. #11
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286
    Problema risolto, avevo posto l'istruzione int CServer::mServer_iValue=0; in Server.h , mentre andava messa in Server.cpp.

    Il programmino funziona e da il risultato cercato.
    A questo punto se non chiedo troppo sarei curioso di sapere che titpi di problemi potrebbe dare una simile soluzione in un ambiente multithreading, e se sia possibile proteggere il codice con qualche tecnica da simili problemi.


    Grazie a tutti

  2. #12
    Originariamente inviato da shodan
    Nell'header file va messo extern CServer::mServer_iValue
    Vuoi dire static, vero?

    @paulin: le variabili statiche sono sempre un problema in ambiente multithreading, visto che sono condivise da tutti i thread che vi possono accedere, il che è causa di potenziali problemi; andrebbero quindi protette con meccanismi di sincronizzazione (mutex, semafori, critical sections per i metodi che vi accedono, ...).
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #13
    Fai diventare mClient_server un riferimento a CServer:

    codice:
    class CClient
    {
    public: 
    	CClient(CServer &theServer);
    	virtual ~CClient(void);
    
    	CServer &mClient_server; // RIFERIMENTO
    	int GetValue(void);
    };
    
    ...
    CClient::CClient(CServer &theServer):
    mClient_server (theServer)
    {
    }
    ...
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int starting = 12;
    	CServer server;
    	CClient client (server);
    	server.SetValue(starting);
    	int returned = client.GetValue();
    
    	std::cout << "Returned value is: " << returned << std::endl;
    	return 0;
    }
    Dato che ci sei, abituati a dichiare virtual i distruttori: avrai molti meno grattacapi in futuro. ;-)

  4. #14
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286
    Originariamente inviato da MacApp Fai diventare mClient_server un riferimento a CServer:
    codice:
    class CClient
    {
    public: 
       ...
    	CClient(CServer&);
    	CServer& mClient_rServer;
       ...
    };
    
       ...
    
    CClient::CClient(CServer& rServer) : mClient_rServer (rServer)
    {
    }
    
       ...
    
    	CClient client (server);
    Ottima soluzione! In accordo con le funzionalità OOP del C++.
    Non avevo interpretato correttamente il tuo consiglio nel post precedente, avevo provato inizializzando un puntatore nel costruttore uttilizzando l'indirizzo di un oggetto appositamente costruito, e senza dotare il costruttore di un argomento. A quel modo ovviamente non cambiava nulla.

    Così il codice funziona e fornisce il comportamento voluto.

    Grazie ancora.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.