Funktion mit Objekt als Übergabe und Rückgabe



  • Hallo zusammen,

    ich bin mir nicht sicher wonach direkt ich googeln kann/soll daher hier mein Problem.

    Ich dachte im Forum das Thema "übergabe von Objekten" wäre meine Lösung aber ich verstehe das nicht oder es geht so nicht.

    Ziel ist es ein Objekt der Klasse "Client" an eine Funktion zu übergeben und diese, quasi bearbeitet, wieder zubekommen um danach mit Ihm weiter zu arbeiten.

    Ich hoffe ich konnte mein Problem einigermaßen verständlich erklären.

    Client* PaFR2000Scanner :: createClient(string strPacketType)
    {
    	string strIp = "0.0.0.0";
    	int iPort = 0;
    
    	Client* cDummy ;
    
    	char cRecBuffer[2048];
    	string strTempRec;
    	string strPort;
    	int iVal = 0;
    
    	try
    	{
    		iVal = *cDummy->connectSocket(strIp,(unsigned short)iPort);
    		if(0 == iVal)
    		{
    			//iVal = cClient->sendMessage(this->createTelegramm("request_handle_tcp",2,"packet_type",strPacketType.c_str(),"port",iPort));
    			if(0 == iVal)
    			{
    				iVal = *cDummy->receiveMessage(cRecBuffer,2048);
    				if(0 == iVal)
    				{
    					strTempRec = cRecBuffer;
    					strErrCode = translateMessage(strTempRec,"error_code",strErrCode);
    					strHandle = translateMessage(strTempRec,"handle",strHandle);
    					strPort = translateMessage(strTempRec,"port",strPort);
    					stringstream sstr(strPort);
    					sstr >> this->iTcpPort;
    				}
    			}
    		}
    		else
    		{
    			iVal = -1;
    		}
    
    	}
    	catch(...)
    	{
    
    	}
    	return *cDummy;
    }
    


  • Und hast du auch eine Frage?



  • dragonfight86 schrieb:

    Ziel ist es ein Objekt der Klasse "Client" an eine Funktion zu übergeben und diese, quasi bearbeitet, wieder zubekommen um danach mit Ihm weiter zu arbeiten.

    class Client
    {
    public:
      int i;
    };
    void f(Client& c)
    {
      c.i = 42;
    }
    int main()
    {
      Client c;
      f(c);
      std::cout << c.i; // prints 42
    }
    


  • Du derefenzierst den Pointer bei dem return. Als Rückgabewert erwartet die Funktion aber einen Pointer.



  • Hallo, danke für die Antwort, leider verstehe ich das noch nicht 😞

    Also ich erstelle ein Objekt, danach erstelle ich einen Pointer auf dieses Objekt und mit dem möchte ich arbeiten....soll heißen ich übergebe ihn der Methode und bekomme Ihn auch mittels return wieder zurück oder sehe ich das schon falsch....

    Folgend mal der Header

    #pragma once
    #include <list>
    #include "Client.h"
    .
    .
    .
    
    class PaFR2000Scanner
    {
    public:
    	PaFR2000Scanner(void);
    	~PaFR2000Scanner(void);
    
    	int PaFR2000Scanner :: createClient22222(int iVal,string strRecieve,string strSend,string strCom,int iCount,...);
    
    	Client* createClient(string strPacketType);
    
    private:	
    	static void threadReceiveScandata(CThread* pclThread);
    
    	CThread* objThread;
    
    };
    


  • Vielleicht noch ein paar Hintergrundinformationen,

    ich möchte ein Gerät ansprechen welches mittels HTTP kommuniziert. Dazu Habe ich mir eine Client Klasse geschrieben welche einen Socket erstellt und modifiziert.

    Das Problem ist, das ich jedesmal wenn ich einen Befehl sende einen neuen Client erstellen muss und das bisher Grauenvoll gecodet ist.

    Was ich nun möchte ist die bereits vorhandenen Funktionen, die mir die Nachricht erstellen und übermitteln, weiter nutzen. Ich möchte die Funktion "create Client" einfach aufrufen und mit dem Client den ich zurück bekomme weiter arbeiten.

    bisher war der Ablauf und das muss doch auch schöner gehen indem ich das wieder auslagere.

    string strIp = "192.168.0.22";
    	int iPort = 80;
    	Client* cClient;
    	char cRecBuffer[2048];
    	string strTempRec;
    	string strPort;
    
    	string quelle;
    	va_list list;
    	string strParameter = "GET /cmd/";
    	strParameter += strCom;
    	strParameter += "?";
    
    	int iVal = 0;
    
    	try
    	{
    		iVal = cClient->connectSocket(strIp,(unsigned short)iPort);
    		if(0 == iVal)
    		{
    			va_start(list,iCount);
    			for(int i=1;i<=iCount;i++)
    			{
    				quelle = va_arg(list,char*);
    				strParameter +=quelle;
    				if( iCount != i )
    				{
    					if( (i%2) == 1 )
    					{
    						strParameter +="=";
    					}
    					else
    					{
    						strParameter += "&";
    					}
    				}				
    			}
    			va_end(list);
    			strParameter += " HTTP/1.0\r\n\r\n";
    
    			iVal = cClient->sendMessage(strParameter);
    			if(iVal == 0)
    			{
    				iVal = cClient->receiveMessage(cRecBuffer,2048);
    
    			}
    		}
    		else
    		{
    			iVal = -1;
    		}
    
    	}
    	catch(...)
    	{
    
    	}
    	return iVal;
    }
    


  • manni66 schrieb:

    Und hast du auch eine Frage?



  • Dein Funktionskopf sieht so aus

    Client* PaFR2000Scanner :: createClient(string strPacketType)
    

    Client* heist, die Funktion gibt ein Pointer auf ein Objekt vom Typ Client zurück.

    Client* cClient;
    

    Hier ertellst du einen Ponter auf einen Client. Aber Achtung, es wird kein Speicher für den Client reserviert und der Client wird nicht erstellt.

    Daher wird wahrscheinlich schon das:

    iVal = *cDummy->connectSocket(strIp,(unsigned short)iPort);
    

    zu einem Fehler führen. Denn dein * dereferenziert den Pointer. Danach willst du tatsächlich ein Objekt vom Typ Client. Hast das Objekt aber nirgends erstellt. Außerdem sollte der Pfeil Operator schon nicht funktionieren, nach einer Dereferenzierung....

    return *cDummy;
    

    Hier willst du das dereferenzierte Objekt zurück geben. Also wirklich ein Objekt vom Typ Client. Der Funktionskopf sagt aber, dass du einen Pointer auf einen Client zurück geben willst.

    Schau dir mal Jockelx kleines Beispiel an. Schön mit einer Referenz, dann Funktioniert alles wie du es dir wünscht. Du erstellst dein Objekt vor dem Funktionsaufruf und übergibst es via Referenz. Dann kannst du dein Objekt in der Funktion bearbeiten wie du willst und hast hinterher an der Stelle von wo aus du die Funktion aufgerufen hast, das modifizierte Objekt.

    dragonfight86 schrieb:

    Hallo, danke für die Antwort, leider verstehe ich das noch nicht 😞

    Also ich erstelle ein Objekt, danach erstelle ich einen Pointer auf dieses Objekt und mit dem möchte ich arbeiten....soll heißen ich übergebe ihn der Methode und bekomme Ihn auch mittels return wieder zurück oder sehe ich das schon falsch....

    Du kannst sowas auch via Pointer machen, aber Referenzen sind einfacher und nicht so Fehler anfällig.



  • Hallo Schlangenmensch,

    bei

    iVal = *cDummy->connectSocket(strIp,(unsigned short)iPort);
    

    hat -> eine höhere Priorität als *, wird also so interpetiert:

    iVal = *(cDummy->connectSocket(strIp,(unsigned short)iPort));
    


  • Argh... natürlich. Das kommt davon, wenn man solche "einfachen" Fragen beantwortet wärend man eine kurze Pause vom eigenen Code macht.

    Mich würde trotzdem wundern, wenn "connectSocket" einen Pointer auf einen int zurück gibt.



  • Habt vielen Dank, mittlerweile läuft es dank euch. Doch die nächsten Probleme werden kommen 😛


Log in to reply