Dobrý den , v hlavičkovem souboru definuji třídy a pokud funkce třídy dám přímo do té definice třídy vše šlape jak má ale pokud funkce dám mimo definici třídy pomocí čtyřtečky (::) například do toho hlavičkového souboru nebo specialně do dapšího .cpp souboru (tam kde jsou i definice normálních funkcí) aby to tvořilo vlastně modul napíše to chybu a píše to : multiple definition pro ty funkce v té tříde, nevíte někdo co s tím ? Mám stejnou chybu jako zde ale nerozumim jim : http://stackoverflow.com/questions/212006/multiple-definition-error-including-c-header-file-with-inline-code-from-multip
Fórum › C / C++
Multiple definition
#1 Sejpak
//v souboru H budeš mít něco jako:
class MyClass
{
public:
void MyFunc(bool b);
}
//tak do souboru cpp uvedeš něco jako:
void MyClass::MyFunc(bool b)
{
if(b)...
}
//a volat to pak můžeš:
MyClass *myClass = new MyClass();
myClass->MyFunc(true);
prostě všechno musíš definovat pouze jednou.
Když sem hodíš konkrétní kód, tak ti někdo přesně poradí.
tady je hlavičkovej soubor :
#ifndef _BREAKER_H
#define _BREAKER_H
int Lock(SDL_Surface* screen);
void palka(SDL_Surface *screen,int x,int y,int x2,int y2);
class Cihla
{
private :
int x,y,x2,y2,red,green,blue;
bool existence;
public :
Cihla();
void nakreslit(SDL_Surface*);
void souradnice_zapis(int,int,int,int);
int souradnice_kontrola(int,int,int);
void barva(Uint8,Uint8,Uint8);
void exist_zapis();
bool exist_kontrola();
};
#endif
tady je cpp
#include <stdio.h>
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include "grafika.h"
#include "breaker.h"
int Lock(SDL_Surface* screen)
{
if(SDL_MUSTLOCK(screen))
{
SDL_LockSurface(screen);
return 1;
}
else
return 0;
}
void palka(SDL_Surface *screen,int x,int y,int x2,int y2)
{
int pom;
bool pohyb = false;
pom = Lock(screen);
for(int i = y;i <= y2;i++)
{
if(i == y || i == y2)
cara(screen,x+3,i,x2-3,i,30,34,158);
else if(i == y+1 || i == y2-1)
cara(screen,x+2,i,x2-2,i,30,34,158);
else if(i == y+2 || i == y2-2)
cara(screen,x+1,i,x2-1,i,30,34,158);
else
cara(screen,x,i,x2,i,14,16,75);
}
if(pom == 1)
SDL_UnlockSurface(screen);
}
Cihla::Cihla()
{
x = 0;
y = 0;
x2 = 0;
y2 = 0;
red = 255;
green = 255;
blue = 255;
existence = false;
}
void Cihla::nakreslit(SDL_Surface*screen)
{
for(int i = y;i <= y2;i++)
cara(screen,x,i,x2,i,red,green,blue);
}
void Cihla::souradnice_zapis(int a,int b,int a2,int b2)
{
if(a >= 0 && a2 <= 799)
{
x = a;
x2 = a2;
}
if(b >= 0 && b2 <= 599)
{
y = b;
y2 = b2;
}
}
int Cihla::souradnice_kontrola(int xkul,int ykul,int r)
{
if((ykul-10 <= y2 && ykul+10 >= y) && (xkul+10 >= x && xkul-10 <= x2) && existence == true)
{
exist_zapis();
return 1;
}
return 0;
}
void Cihla::barva(Uint8 r,Uint8 g,Uint8 b)
{
red = r;
green = g;
blue = b;
}
void Cihla::exist_zapis()
{
if(existence)
existence = false;
else
existence = true;
}
bool Cihla::exist_kontrola()
{
return existence;
}
a píše to multiple defined :(
nene tím to určitě není
tak proč to v kódu co jsi tu dal nemáš ?
tam jakoby všechny funkce vypisujou že sou multiple definition
i konstruktor?
že se to člověk jen učí tak je jedno co použije
právě, když se člověk učí, tak potřebuje nedostatky popsat co nejlépe
#12 Sejpak
to ho nezajímá, soubor H nic o souboru CPP neví
správně by jsi to měl mít:
#ifndef _BREAKER_H
#define _BREAKER_H
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
int Lock(SDL_Surface* screen);
void palka(SDL_Surface *screen,int x,int y,int x2,int y2);
class Cihla
{
private :
int x,y,x2,y2,red,green,blue;
bool existence;
public :
Cihla();
void nakreslit(SDL_Surface*);
void souradnice_zapis(int,int,int,int);
int souradnice_kontrola(int,int,int);
void barva(Uint8,Uint8,Uint8);
void exist_zapis();
bool exist_kontrola();
};
#endif
a cpp:
#include <stdio.h>
#include <iostream>
#include <cmath>
#include <cstdlib>
#include "grafika.h"
#include "breaker.h"
int Lock(SDL_Surface* screen)
{
if(SDL_MUSTLOCK(screen))
{
SDL_LockSurface(screen);
return 1;
}
else
return 0;
}
//atd.
tak ale i když sem to tam daval nic se nestalo , a jak říkam program funguje když funkce jsou ve třídě
ale když je dám pryč pomocí té :: tak my to píše tu chybu. takže to ani nemuže být tím includem protože by to dělalo error i pokud by funkce byly ve třídě.
zde se to řešilo ale moc tomu nerozumim : http://stackoverflow.com/…-from-multip
#18 Sejpak tam spíš řeší použití ve více projektech.
Ty máš v některém ze souborů duplicitně "void Cihla::nakreslit(SDL_Surface*screen)" - třeba v souboru grafika.h. Normálně se to řeší tak jak jsem psal v příspěvku výše (pouze jsem zapomněl v deklaraci třídy za } dát ; - to je důležité).
V první řadě bych radil si pořídit novější IDE (to co používáš vyšlo v roce 2004), u modernějších se často přesně dozvíš, kde se duplikát nalézá. (Když už nechceš Visual Studio ani Code::Blocks, tak si sežeň alespoň dev-C++ 5.11)
#19 BDS
neříkám že to nechci , asi přejdu na visual studio nebo Qt creator :-) (5.11 sem zkoušel a dělá zde probelmy SDL) . a jinak pravěže v kodu nic duplicitně neni jestli myslíš jako že je to dedinovano několikrat . i jsem zkoušel jak si psal že do cpp teda dam ty metody a do .H prototypy do class . a prostě to píše multiple definition ...
začínam mít silnou obavu že sem hlupák co tu obtěžuje přitom sem nikdy při kompilaci vlastně nezkompiloval klávesou F11 která kompiluje vše , protože například v .H udělam schválně chybu a pokud zkompiluji f9 chyba se nenajde a program běží protože soubor byl již jednou zkompilovan ale pokud zkompiluju F11 chyba se najde porotože se zkompilujou všechny soubory ...
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Problem s multiple definition — založil frostwyrm333
DL DT DD definition list — založil kall_ell
A function definition is not allowed here before { token — založil Jacobs322
Multiple background a grandienty — založil G3ORG3
Multiple insert into select — založil Facedown
Moderátoři diskuze