Statische funktion einer klasse wird nich gefunden??



  • Habe hier mal meine klasse welche in extra H und cpp Datei gekapselt ist:

    //H
    class object{
    
    public:
    
     static object* GetNew();
    }
    
    //CPP
    
    #include "object.h"
    object* object::GetNew(){
     return ....;
    }
    
    //main
    
    #include "object.h"
    
    int main(){
    
     object *p = object::GetNew(); //<-- her der fehler.... warum??
    
    }
    


  • Welcher Fehler? Hat er etwas mit dem fehlenden Semikolon am Ende der Klassendefinition zu tun?



  • Wie hast du das ganze denn gebaut? Wahrscheinlich linkst du die beiden Dateien nicht zusammen, vom Code her stimmt jedenfalls alles.

    Felix

    EDIT: Und nat├╝rrlich fehlt ein Semikolon am ende der Klassendefinition ­čśë Aber das w├╝rde nicht zu einem "unresolved external" f├╝hren, das sind normalerweise linker probleme.



  • Phoemuex schrieb:

    EDIT: Und nat├╝rrlich fehlt ein Semikolon am ende der Klassendefinition ­čśë Aber das w├╝rde nicht zu einem "unresolved external" f├╝hren, das sind normalerweise linker probleme.

    Stimmt, den Titel habe ich bei meiner Antwort gar nicht mehr ber├╝cksichtigt (deshalb auch meine Frage "Welcher Fehler?") ­čśë

    Ich hab mir auch noch ├╝berlegt, zu fragen, ob die CPP-Datei ├╝berhaupt kompiliert werde... Hab dann gedacht, das wird er kaum vergessen haben :p



  • ok hier die Kompletten klassen:

    PR2_Comm.h

    class CPR2_Comm;
    
    typedef std::map<UINT,CPR2_Comm*> ComTable;
    typedef ComTable::iterator itComTable;
    
    class CPR2_Comm
    {
    
    	UINT m_iPort;
    	UINT m_iRefCount;
    	static ComTable m_ConnPorts;
    
    	CPR2_Comm(UINT);
    	virtual ~CPR2_Comm(void);
    
    public:
    
    	static CPR2_Comm* AllocComm(UINT);
    	static void ReleaseComm(const CPR2_Comm*);
    
    };
    

    CPR2_Comm.cpp

    #include "StdAfx.h"
    #include "pr2_comm.h"
    
    CPR2_Comm::CPR2_Comm(UINT iPort) : m_iPort(iPort),
    				m_iRefCount(0)
    {
    }
    
    CPR2_Comm::~CPR2_Comm()
    {
    
    }
    
    CPR2_Comm* CPR2_Comm::AllocComm(UINT iComPort)
    {
    	//Ref Counter
    	if(m_ConnPorts.end() == m_ConnPorts.find(iComPort))
    		m_ConnPorts[iComPort]= new CPR2_Comm(iComPort);
    	m_ConnPorts[iComPort]->m_iRefCount++;
    	return m_ConnPorts[iComPort];
    
    }
    
    void CPR2_Comm::ReleaseComm(const CPR2_Comm* pPortRef)
    {
    	//Find Comref
    	itComTable it= m_ConnPorts.end();
    	for(it= m_ConnPorts.begin(); it != m_ConnPorts.end() && it->second!=pPortRef ;++it);
    
    	if((it== m_ConnPorts.end()) != ((--it->second->m_iRefCount)==0))
    	{
    		delete it->second;
    		m_ConnPorts.erase(it);
    	}
    }
    

    main.cpp

    #include "stdafx.h"
    #include "pr2_comm.h"
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	CPR2_Comm *p= CPR2_Comm::AllocComm(1); //<-- PROBLEM
    	return 0;
    }
    


  • Du hast in deiner Klasse ein

    static ComTable m_ConnPorts;
    

    Wenn man eine statische Variable in einer Klasse hat, muss man die genau wie Methoden nochmal definieren. In PR2_Comm.cpp sollte also irgendwo ein

    ComTable CPR2_Comm::m_ConnPorts;
    

    stehen.

    Felix



  • Danke das wars Problem;) thx


Log in to reply