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

[Allegro] Visual C++, multiple definition, linker error

Ostatnio zmodyfikowano 2009-07-27 21:06
Autor Wiadomość
steckel
Temat założony przez niniejszego użytkownika
[Allegro] Visual C++, multiple definition, linker error
» 2009-07-21 22:18:07
Mam problem z konstruktorem. Kompilator "mówi", że mam multidefinicję:
C/C++
#include <string>
#include <allegro.h>
using namespace std;
class cObject {
public:
    string m_strName;
    int m_iPositionX;
    int m_iPositionY;
    BITMAP * m_bmImage;
    int m_iWidth;
    int m_iHeight;
    cObject();
    cObject( string, int, int, string );
};

class cCharacter
    : public cObject
{
public:
    int m_iHP;
    int m_iAttack;
    int m_iDefense;
    int m_iInjuryMin;
    int m_iInjuryMax;
    int m_iSpeed;
};

class cMonster
    : public cCharacter
{
};

class cPlayer
    : public cCharacter
{
};

cObject::cObject() {
    string m_strName = "Object";
    int m_iPositionX = 0;
    int m_iPositionY = 0;
    BITMAP * m_bmImage = create_bitmap( 50, 50 );
    int m_iWidth = 50;
    int m_iHeight = 50;
}

cObject::cObject( string strName, int iPositionX, int iPositionY, string strPathOfFile ) {
    string m_strName = strName;
    int m_iPositionX = iPositionX;
    int m_iPositionY = iPositionY;
    BITMAP * m_bmImage = load_bmp( strPathOfFile.c_str(), default_palette );
    int m_iWidth = m_bmImage->w;
    int m_iHeight = m_bmImage->h;
}
Logi:
C/C++
D:\p rojekty\inne\diablo\class.cpp || In constructor ` cObject::cObject() ':|
D:\p rojekty\inne\diablo\class.cpp | 34 | warning
    : unused variable 'm_iPositionX' | D:\p rojekty\inne\diablo\class.cpp | 35 | warning
    : unused variable 'm_iPositionY' | D:\p rojekty\inne\diablo\class.cpp | 36 | warning
    : unused variable 'm_bmImage' | D:\p rojekty\inne\diablo\class.cpp | 37 | warning
    : unused variable 'm_iWidth' | D:\p rojekty\inne\diablo\class.cpp | 38 | warning
    : unused variable 'm_iHeight' | D:\p rojekty\inne\diablo\class.cpp || In constructor ` cObject::cObject( std::string, int, int, std::string ) ':| D:\p rojekty\inne\diablo\class.cpp | 43 | warning
    : unused variable 'm_iPositionX' | D:\p rojekty\inne\diablo\class.cpp | 44 | warning
    : unused variable 'm_iPositionY' | D:\p rojekty\inne\diablo\class.cpp | 46 | warning
    : unused variable 'm_iWidth' | D:\p rojekty\inne\diablo\class.cpp | 47 | warning
    : unused variable 'm_iHeight' | D:\p rojekty\inne\diablo\main.cpp || In function ` int _mangled_main() ':| D:\p rojekty\inne\diablo\main.cpp | 8 | warning
    : control reaches end of non - void function | D:\p rojekty\inne\diablo\class.cpp || In constructor ` cObject::cObject() ':| D:\p rojekty\inne\diablo\class.cpp | 34 | warning
    : unused variable 'm_iPositionX' | D:\p rojekty\inne\diablo\class.cpp | 35 | warning
    : unused variable 'm_iPositionY' | D:\p rojekty\inne\diablo\class.cpp | 36 | warning
    : unused variable 'm_bmImage' | D:\p rojekty\inne\diablo\class.cpp | 37 | warning
    : unused variable 'm_iWidth' | D:\p rojekty\inne\diablo\class.cpp | 38 | warning
    : unused variable 'm_iHeight' | D:\p rojekty\inne\diablo\class.cpp || In constructor ` cObject::cObject( std::string, int, int, std::string ) ':| D:\p rojekty\inne\diablo\class.cpp | 43 | warning
    : unused variable 'm_iPositionX' | D:\p rojekty\inne\diablo\class.cpp | 44 | warning
    : unused variable 'm_iPositionY' | D:\p rojekty\inne\diablo\class.cpp | 46 | warning
    : unused variable 'm_iWidth' | D:\p rojekty\inne\diablo\class.cpp | 47 | warning
    : unused variable 'm_iHeight' | D:\p rojekty\inne\diablo\.objs\class.o(.text + 0x0 ) || In function ` ZN7cObjectC2Ev ':| D:\p rojekty\inne\diablo\class.cpp | 32 | multiple definition of ` cObject::cObject() '| D:\p rojekty\inne\diablo\.objs\main.o(.text + 0xa2 )
    : D:\p rojekty\inne\diablo\class.cpp | 32 | first defined here | D:\p rojekty\inne\diablo\.objs\class.o(.text + 0x346 ) || In function ` ZN7cObjectC1Ev ':| D:\p rojekty\inne\diablo\class.cpp | 32 | multiple definition of ` cObject::cObject() '| D:\p rojekty\inne\diablo\.objs\main.o(.text + 0x3e8 )
    : D:\p rojekty\inne\diablo\class.cpp | 32 | first defined here | D:\p rojekty\inne\diablo\.objs\class.o(.text + 0x68c ) || In function ` ZN7cObjectC2ESsiiSs ':| D:\p rojekty\inne\diablo\class.cpp | 41 | multiple definition of ` cObject::cObject( std::string, int, int, std::string ) '| D:\p rojekty\inne\diablo\.objs\main.o(.text + 0x72e )
    : D:\p rojekty\inne\diablo\class.cpp | 41 | first defined here | D:\p rojekty\inne\diablo\.objs\class.o(.text + 0x9aa ) || In function ` ZN7cObjectC1ESsiiSs ':| D:\p rojekty\inne\diablo\class.cpp | 41 | multiple definition of ` cObject::cObject( std::string, int, int, std::string ) '| D:\p rojekty\inne\diablo\.objs\main.o(.text + 0xa4c )
    : D:\p rojekty\inne\diablo\class.cpp | 41 | first defined here | ||=== Build finished
    : 8 errors
    , 19 warnings ===|
P-8676
DejaVu
» 2009-07-21 22:25:20
Poczytaj jak się dzieli kod na kilka plików. Wygląda na to, że używasz właśnie tej techniki.
Pliki z deklaracjami klas powinny być w *.hpp, z definicjami metod *.cpp. Do tego na początku plików *.hpp powinno być #pragma once lub odpowiedni #ifndef zrobiony.
P-8677
steckel
Temat założony przez niniejszego użytkownika
» 2009-07-21 22:35:01
W kursie jest mowa o plikach nagłówkowych i źródłowych, ale te pierwsze wydają mi się bez sensu, bo chyba można wszystko definiować w plikach źródłowych?
P-8678
DejaVu
» 2009-07-21 22:37:09
Jeśli uważasz, że wiesz lepiej... to ja Ci pomóc nie mogę :)
P-8679
steckel
Temat założony przez niniejszego użytkownika
» 2009-07-21 22:49:27
Nie uważam, że wiem lepiej, a wręcz przeciwnie. Staram się tylko zrozumieć dlaczego należy definiować wszystko w pliku nagłówkowym (hpp), zamiast bezpośrednio w pliku źródłowym (cpp).
P-8680
DejaVu
» 2009-07-21 23:08:17
A czy odpowiedź 'żeby działało' będzie dla Ciebie zadowalająca...? Przeczytaj rozdział dlaczego deklaracje umieszcza się w pliku *.hpp, a definicje w *.cpp. To tak jak byś się pytał dlaczego się robi fundamenty pod budynek, skoro można by było postawić odrazu ściany... pytanie o ile jest sensowne o tyle budowanie budynku bez fundamentów już nie.

Taką technikę tworzenia kodu stosuje się od zalania dziejów w programowaniu. Napotkałeś na problem, ponieważ chcesz coś zrobić po swojemu, a nie wg. standardów wypracowanych latami (który między innymi po to nawiasem mówiąc został zrobiony) i piszesz, że plik *.hpp jest wg. Ciebie zbędny... im więcej będziesz pisał dużych projektów tym bardziej docenisz istnienie plików nagłówkowych *.hpp.
P-8681
DejaVu
» 2009-07-22 00:04:59
Człowiek uczy się całe życie ;p dzięki :)

Dante: usuń lub popraw możliwość wpisania [/code  zwin] -> to nie działa
P-8682
steckel
Temat założony przez niniejszego użytkownika
» 2009-07-22 10:27:19
Po prostu myślałem, że jest w tym jakiś głębszy sens, no ale jeżeli jest to po prostu standard kodowania to nie mam więcej pytań :) Tematu nie zamykam, bo nie wiem czy to naprawi mój pierwszy problem.

//-----------------

Problem jest nadal.

main.cpp:
C/C++
#include <allegro.h>
#include "class.cpp"

int main()
{
   
}
END_OF_MAIN();

class.cpp:
C/C++
#include <string>
#include <allegro.h>
#include "class.hpp"
using namespace std;

cObject::cObject() {
    string m_strName = "Object";
    int m_iPositionX = 0;
    int m_iPositionY = 0;
    BITMAP * m_bmImage = create_bitmap( 50, 50 );
    int m_iWidth = 50;
    int m_iHeight = 50;
}

cObject::cObject( string strName, int iPositionX, int iPositionY, string strPathOfFile ) {
    string m_strName = strName;
    int m_iPositionX = iPositionX;
    int m_iPositionY = iPositionY;
    BITMAP * m_bmImage = load_bmp( strPathOfFile.c_str(), default_palette );
    int m_iWidth = m_bmImage->w;
    int m_iHeight = m_bmImage->h;
}

class.hpp:
C/C++
#ifndef class_hpp
#define class_hpp

using namespace std;

class cObject {
public:
    string m_strName;
    int m_iPositionX;
    int m_iPositionY;
    BITMAP * m_bmImage;
    int m_iWidth;
    int m_iHeight;
    cObject();
    cObject( string, int, int, string );
};

class cCharacter
    : public cObject
{
public:
    int m_iHP;
    int m_iAttack;
    int m_iDefense;
    int m_iInjuryMin;
    int m_iInjuryMax;
    int m_iSpeed;
};

class cMonster
    : public cCharacter
{
};

class cPlayer
    : public cCharacter
{
};


#endif

Logi są takie jak poprzednio.
P-8690
« 1 » 2 3 4 5 6 7
  Strona 1 z 7 Następna strona