Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Nakładające się nazwy funkcji (metod)

Ostatnio zmodyfikowano 2015-03-01 17:03
Autor Wiadomość
fokusx
Temat założony przez niniejszego użytkownika
Nakładające się nazwy funkcji (metod)
» 2015-03-01 16:23:34
Zaprogramowałem klasę, w której znajduje się metoda o nazwie "GetObject".
Nazwa tej klasy to "C_ObjectManager".

Niestety przy kompilacji wyświetla mi się błąd:

1>  LINK : X:\ADRES\visual studio 2010\Projects\XXX\Debug\XXX.exe not found or not built by the last incremental link; performing full link
1>main.obj : error LNK2019: unresolved external symbol "public: class Object * __thiscall C_ObjectManager::GetObjectA(unsigned int)" (?GetObjectA@C_ObjectManager@@QAEPAVObject@@I@Z) referenced in function "public: void __thiscall GameManager::Initialize(void)" (?Initialize@GameManager@@QAEXXZ)
1>X:\ADRES\visual studio 2010\Projects\XXX\Debug\XXX.exe : fatal error LNK1120: 1 unresolved externals

"GetObject" została zadeklarowana w (nie moja funkcja) WinGDI.h .




Istnieje jakaś możliwość by nazwa mojej metody pozostała taka jaka jest?
P-127509
aksen
» 2015-03-01 16:42:04
Metody w wielu rożnych klasach mogą mieć i mają te same nazwy. Nie tu jest błąd.

poczytaj:
http://warsztat.gd/wiki​/Unresolved+External+Symbol
P-127510
fokusx
Temat założony przez niniejszego użytkownika
» 2015-03-01 17:02:18
hm, żaden opis - przyczyna - nie zgadza się z moim problemem.

Po pierwsze, gdy zmienię nazwę metody na np. GetObjectM (w deklaracji i definicji), to działa jak należy.
Po drugie, metoda posiada definicje w pliku .cpp oraz deklaracje w .h
Po trzecie, przy definicji metoda ma dopisany fragment nazwy klasy (C_ObjectManager::)


Może przedstawię ten fragment kodu:

Plik Object.h
C/C++
class C_ObjectManager
{
public:
    ...
    Object * GetObject( unsigned int id );
    ...

plik Object.cpp
C/C++
Object * C_ObjectManager::GetObject( unsigned int id )
{
    if( id < 0 || id >= c_Object.size() )
         return NULL;
   
    return c_Object[ id ];
}

plik main.cpp
C/C++
#include <Windows.h>
#include <iostream>
#include "mesh.h"
#include "map.h"

...

this->ObjectManager->GetObject( 0 )->rotation.v[ 0 ];

...
, gdzie ObjectManager to klasa C_ObjectManager.
P-127512
Monika90
» 2015-03-01 17:03:36
Problem polega na tym, że GetObject to jest makro zdefiniowane w wingdi.h.
Dodaj dyrektywę
C/C++
#undef GetObject
w odpowiednim miejscu, prawdopodobnie przed definicją klasy będzie dobrze.

Jeżeli gdzieś używasz GetObject jako funkcji WinAPI, to będziesz musiał używać jej pod nazwą GetObjectA lub GetObjectW, zależnie od tego czy chcesz wersję unkodową czy nie.

Albo po prostu zmień nazwę metody na jakąś inną.

EDIT, ponieważ widzę teraz, że masz #include <windows.h> również w pliku cpp, to tam też daj #undef GetObject, najlepiej po każdym #include <windows.h>

Albo po prostu zmień nazwę metody na jakąś inną.
P-127513
« 1 »
  Strona 1 z 1