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 ...
Zjistit počet nových příspěvků
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
TIP: Přetáhni ikonu na hlavní panel pro připnutí webu



Nahlásit jako SPAM
IP: 185.64.40.–
Věrný člen

