Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286

    [C++]Riferimento allo stesso oggetto tra classi

    Vorrei creare un oggetto CServer, e riferirmi sempre ad esso e ai suoi attributi. Tutto bene finché non ho separato il codice in classi, così accade che ogni volta che creo una istanza della classe CServer creo un oggetto nuovo, e pertanto ogni volta che voglio accedere ad un suo attributo non faccio altro che accedere ad un attributo di un oggetto diverso.
    Ecco il mio tentativo:

    codice:
    // Server.h
    #pragma once 
    
    class CServer
    {
    public: 
    	CServer(void);
    	~CServer(void);
    
    	int mServer_iValue;
    	void SetValue(int&);
    };
    
    // Server.cpp 
    #include "StdAfx.h"
    #include "Server.h"
    
    CServer::CServer(void)
    {
    	mServer_iValue = 0;
    }
    
    CServer::~CServer(void)
    {
    }
    
    void CServer::SetValue(int& a)
    {
    	mServer_iValue = a;
    }
    codice:
    //Client.h 
    #pragma once
    #include "Server.h"
    
    class CClient
    {
    public: 
    	CClient(void);
    	~CClient(void);
    
    	CServer mClient_server;
    	int GetValue(void);
    };
    
    //Client.cpp 
    #include "StdAfx.h"
    #include "Client.h"
    
    CClient::CClient(void)
    {
    }
    
    CClient::~CClient(void)
    {
    }
    
    int CClient::GetValue(void)
    {
    	return mClient_server.mServer_iValue;
    }
    codice:
    //Main.cpp 
    #include "stdafx.h"
    #include "Server.h"
    #include "Client.h"
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int starting = 12;
    	CServer server;
    	CClient client;
    	server.SetValue(starting);
    	int returned = client.GetValue();
    
    	std::cout << "Returned value is: " << returned << std::endl;
    	return 0;
    }
    Il valore ritornato è "0" e non "12". Il motivo mi dovrebbe essere chiaro, cioé i valori fanno riferimento a due oggetti diversi, anche se sono istanze della stessa classe. Purtroppo per la ma limitarta esperienza non so quale tecnica debbo uilizzare per riuscire ad accedere al valore mServer_iValue riferito sempre allo stesso oggetto. Utilizzado i puntatori ho ottenuto lo stesso risultato (evidentemente commettendo la stessa ingenuità!).

    Attendo un qualche suggerimento.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Il tuo quesito non e' chiaro ...

    Che vuoi dire con

    "riuscire ad accedere al valore mServer_iValue riferito sempre allo stesso oggetto"

    ?

    Se gli oggetti sono due, il quesito non ha senso.

    Se l'oggetto e' solo uno, puoi avere diversi puntatori allo stesso oggetto ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Potresti fare in modo che il membro mClient_server di CClient sia un riferimento od un puntatore, che andrai ad inizializzare nel costruttore di CClient.

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286
    Originariamente inviato da oregon Che vuoi dire con: "riuscire ad accedere al valore mServer_iValue riferito sempre allo stesso oggetto" ?
    Ciao oregon,

    Gli oggetti di tipo CServer che ho creato sono due: mClient_server che è un membro di CClient, e server che è creato all'interno della funzione main. Nel mio precedente tentativo, all'interno di main il codice chiamate server.SetValue(starting); imposta il valore di server.mServer_iValue mentre client.GetValue(); ottiene il valore di client.mClient_server.mServer_iValue. Il risultato mostra chiaramente che i valori sono diversi perché la variabile omonima appartiene nei due casi a due oggetti diversi.
    Il mio obiettivo sarebbe quello di avere un riferimento alla medesima variabile mServer_iValue servita da CServer, sia all'interno della funzione main che all'interno della classe CClient.

    Nol frattempo ho risolto semplicemente invocando i metodi partendo sempre dallo stesso oggetto:

    codice:
    	CClient client;
    	client.mClient_server.SetValue(starting);
    	int returned = client.GetValue();
    In questo modo l'oggetto che invoca la variabile mServer_iValue è sempre CClient e il risultato è quello aspettato, returned assume valore 12.

    Non so poi se effetivamente questa rappresenti la scelta più conveniente e semanticamente più corretta.

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Puoi risolvere anche così:
    codice:
    class CServer
    {
    public: 
    	CServer(void);
    	~CServer(void);
    
    	static int mServer_iValue;
    	void SetValue(int&);
    };
    int CServer::iValue=0;
    In questo modo mServer_iValue sarà condivisa da ogni istanza di CServer.
    Però questo può causare problemi in ambienti MultiThreading.

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286
    Originariamente inviato da shodan
    Puoi risolvere anche così:
    codice:
    class CServer
    {
    public: 
    	CServer(void);
    	~CServer(void);
    
    	static int mServer_iValue;
    	void SetValue(int&);
    };
    int CServer::iValue=0;
    In questo modo mServer_iValue sarà condivisa da ogni istanza di CServer.
    Però questo può causare problemi in ambienti MultiThreading.
    uh! É proprio quel che cercavo. Ora sto cercando di capire come risolvere un errore del liker:

    codice:
    Linking...
    Client.obj : error LNK2001: unresolved external symbol "public: static int CServer::mServer_iValue" (?mServer_iValue@CServer@@2HA)
    Server.obj : error LNK2001: unresolved external symbol "public: static int CServer::mServer_iValue" (?mServer_iValue@CServer@@2HA)
    Test.obj : error LNK2001: unresolved external symbol "public: static int CServer::mServer_iValue" (?mServer_iValue@CServer@@2HA)
    Debug/Test.exe : fatal error LNK1120: 1 unresolved externals
    Compilo con VisualC++ 7.1 Standard edition.

  7. #7
    Hai messo in uno dei file .cpp la riga
    codice:
    int CServer::iValue=0;
    ?
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286
    Originariamente inviato da MItaly
    Hai messo in uno dei file .cpp la riga int CServer::iValue=0;?
    Infatti l'avevo dimenticata, però ora sono messo così:

    codice:
    Linking...
    Server.obj : error LNK2005: "public: static int CServer::mServer_iValue" (?mServer_iValue@CServer@@2HA) already defined in Client.obj
    Test.obj : error LNK2005: "public: static int CServer::mServer_iValue" (?mServer_iValue@CServer@@2HA) already defined in Client.obj
    Debug/Test.exe : fatal error LNK1169: one or more multiply defined symbols found
    sto cercando di risolvere ...

  9. #9
    Quella riga va messa in uno solo dei file .cpp, e non nel file .h.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Nell'header file va messo extern CServer::mServer_iValue e in Cserver.cpp
    int CServer::iValue=0
    (come indicato da MItaly)

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 © 2024 vBulletin Solutions, Inc. All rights reserved.