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


Anmelden zum Antworten