Multiple definition – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Multiple definition – C / C++ – Fórum – Programujte.comMultiple definition – C / C++ – Fórum – Programujte.com

 
Hledat
Vybavení pro Laser Game
Spuštěn Filmový magazín
Laser Game Brno
Pergoly a střechy Brno

Sejpak
~ Anonymní uživatel
20 příspěvků
31. 10. 2016   #1
-
0
-

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

Nahlásit jako SPAM
IP: 185.64.40.–
BDS+3
Věrný člen
31. 10. 2016   #2
-
0
-

#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í.

Nahlásit jako SPAM
IP: 185.69.69.–
W10 :)
Sejpak
~ Anonymní uživatel
20 příspěvků
31. 10. 2016   #3
-
0
-

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 :(

Nahlásit jako SPAM
IP: 185.64.40.–
Sejpak
~ Anonymní uživatel
20 příspěvků
31. 10. 2016   #4
-
0
-

#3 Sejpak
prosím berte ohled na tu upravu ... 

Nahlásit jako SPAM
IP: 185.64.40.–
Sejpak
~ Anonymní uživatel
20 příspěvků
31. 10. 2016   #5
-
0
-

#4 Sejpak
přesně co to píše :např :   multiple definition of `Cihla::nakreslit(SDL_Surface*)'   

first defined here 

Nahlásit jako SPAM
IP: 185.64.40.–
Sejpak
~ Anonymní uživatel
20 příspěvků
31. 10. 2016   #6
-
0
-

za zmínku stojí ještě že používám dev c++ 4.9.9.2

Nahlásit jako SPAM
IP: 185.64.40.–
BDS+3
Věrný člen
31. 10. 2016   #7
-
0
-

#6 Sejpak
není to náhodou proto, že v souboru H ti chybí #include <SDL/SDL.h> (nezná SDL_Surface)?

ps, divím se, že se trápíš na mrtvole dev c++ 4.9.9.2 ..

Nahlásit jako SPAM
IP: 185.69.69.–
W10 :)
Sejpak
~ Anonymní uživatel
20 příspěvků
31. 10. 2016   #8
-
0
-

nene tím to určitě není , a s tím deven , zatim to je tak že se to člověk jen učí tak je jedno co použije :-)

Nahlásit jako SPAM
IP: 185.64.40.–
Sejpak
~ Anonymní uživatel
20 příspěvků
31. 10. 2016   #9
-
0
-

#8 Sejpak
tam jakoby všechny funkce vypisujou že sou multiple definition , tam to byl jen přesný příklad chyby

Nahlásit jako SPAM
IP: 185.64.40.–
BDS+3
Věrný člen
31. 10. 2016   #10
-
0
-

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 

Nahlásit jako SPAM
IP: 185.69.69.–
W10 :)
Sejpak
~ Anonymní uživatel
20 příspěvků
31. 10. 2016   #11
-
0
-

no protože je soubor .H includovan do souboru .cpp . A i kdž sem to tam zkoušel dát tak se to neopravilo.

Nahlásit jako SPAM
IP: 185.64.40.–
Sejpak
~ Anonymní uživatel
20 příspěvků
31. 10. 2016   #12
-
0
-

myslím do souboru main.cpp kde je includovana i knihovna SDL

Nahlásit jako SPAM
IP: 185.64.40.–
BDS+3
Věrný člen
31. 10. 2016   #13
-
0
-

#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.
Nahlásit jako SPAM
IP: 185.69.69.–
W10 :)
Sejpak
~ Anonymní uživatel
20 příspěvků
31. 10. 2016   #14
-
0
-

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ě.

Nahlásit jako SPAM
IP: 185.64.40.–
Sejpak
~ Anonymní uživatel
20 příspěvků
31. 10. 2016   #15
-
0
-

mam to tak jak jste mi napsal , ale prostě chyba je tu pořád multiple definition na všech funkcích ve třídě

Nahlásit jako SPAM
IP: 185.64.40.–
BDS+3
Věrný člen
31. 10. 2016   #16
-
0
-

#15 Sejpak
a co tohle:

go into the Project Options (Alt + P). In the files tab, find the name of the .cpp file that has your class in, click it. Click once in the box next to "include in linking."

Nahlásit jako SPAM
IP: 185.69.69.–
W10 :)
Sejpak
~ Anonymní uživatel
20 příspěvků
31. 10. 2016   #17
-
0
-

zahrnuto v linkování to mám (odškrtnuté políčko použít při linkování , i použít při kompilaci)

Nahlásit jako SPAM
IP: 185.64.40.–
Sejpak
~ Anonymní uživatel
20 příspěvků
31. 10. 2016   #18
-
0
-
Nahlásit jako SPAM
IP: 185.64.40.–
BDS+3
Věrný člen
1. 11. 2016   #19
-
0
-

#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)

Nahlásit jako SPAM
IP: 185.69.69.–
W10 :)
Sejpak
~ Anonymní uživatel
20 příspěvků
1. 11. 2016   #20
-
0
-

#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 ...

Nahlásit jako SPAM
IP: 185.64.40.–
Sejpak
~ Anonymní uživatel
20 příspěvků
1. 11. 2016   #21
-
0
-

blbě se to vysvětluje ale právě sem zkopíroval a smazal kod klavesou ctrl+x a vložil ho tam znova a najednou se to rozchodilo , nevím co si o tom mám myslet ...

Nahlásit jako SPAM
IP: 185.64.40.–
Sejpak
~ Anonymní uživatel
20 příspěvků
1. 11. 2016   #22
-
0
-

tet mě napada jedna věc , mačkal sem vždy F9 což znamená zkompilovat , a klavesa F11 znamena zkompilovat vše , je dost možne že tady byl problem ale teda opravdu nevím jak to ...

Nahlásit jako SPAM
IP: 185.64.40.–
Sejpak
~ Anonymní uživatel
20 příspěvků
1. 11. 2016   #23
-
0
-

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 ...

Nahlásit jako SPAM
IP: 185.64.40.–
BDS+3
Věrný člen
1. 11. 2016   #24
-
0
-

#23 Sejpak
v dnešní době používat software, který byl aktualizován naposled před 12ti lety...

Už chápeš, proč to není dobrý nápad.

Nahlásit jako SPAM
IP: 185.69.69.–
W10 :)
Sejpak
~ Anonymní uživatel
20 příspěvků
2. 11. 2016   #25
-
0
-

Tak ja si myslím že téma se muže uzamknout , problém vyřešen :-)

Nahlásit jako SPAM
IP: 176.222.224.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 43 hostů

Podobná vlákna

Problem s multiple definition — založil frostwyrm333

DL DT DD definition list — založil kall_ell

Multiple insert into select — založil Facedown

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032021 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý