Gå til innhold

Already defined in xxx.obj


Anbefalte innlegg

Heisann.

Får feilene

error LNK2005: "int __cdecl ReadNumber(void)" (?ReadNumber@@YAHXZ) already defined in main.obj

error LNK2005: "void __cdecl WriteAnswer(void)" (?WriteAnswer@@YAXXZ) already defined in main.obj

fatal error LNK1169: one or more multiply defined symbols found

 

main cpp:

#include "stdafx.h"
#include "io.cpp"
#include <iostream>

int main()
{
using namespace std;
WriteAnswer();
return 0;
}

io.cpp:

#include "stdafx.h"
#include <iostream>

int ReadNumber()
{
using namespace std;
cout << "Skriv et tall ";
int x;
cin >> x;
cout << "Du skrev " << x << endl;
cout << "Skriv et nytt tall ";
int y;
cin >> y;
cout << "Du skrev " << y << endl;
int z;
z = y + x;
return z;
}

void WriteAnswer()
{
using namespace std; 
cout << "Svaret er " << ReadNumber() << endl;
}

Hva er galt?

 

Bruker Visual C++ Studio

EDIT: Ser nå at tråden kan flyttes inn i nybegynnerhjelptråden. Sorry!

EDIT2: Jeg begynte å lese på Accelerated C++ boken, men fant ut at http://www.learncpp.com var enklere å bruke så jeg har byttet til den siden. Er dette et dumt valg? Har bare kommet noen kapitler, så det er fortsatt ikke for seint å snu.

Endret av Todda7
Lenke til kommentar
Videoannonse
Annonse

ojoj det tokk litt tid før jeg fant det ut.

 

Det som skjer er at kompilatoren kompilerer io.cpp for så kompilere main.cpp (som inneholder hele io.cpp m.m.) og når den så skal linke dette sammen så finner den flere like funksjoner og da stopper linkeren.

 

Løsningen er da:

1. Inkludere headere ikke source filer,

2. Fjern io.cpp fra visual studio prosjektet.

3. Legge inn prototyper på funksjonene fra io.cpp i main.cpp

 

Jeg ville gått for nr 1 ettersom det er den metoden jeg (og mange andre) syntes uten tvil er best.

 

eksempel på io.h:

void WriteAnswer();
int ReadNumber();

 

Lykke til

Lenke til kommentar
EDIT: Det fungerte, tusen takk! Men hvorfor er det slik?

 

Problemet er at du gjennom å #include io.cpp blir det definert innholdet i f. eks. WriteAnswer ( alt inni {} ) og det må ikke være flere steder i koden, men det å definere en prototype av funksjonen ""int ReadNumber();" er helt greit og det kan ligger så mange steder du bare vil i koden.

 

Det å legge prototyper (pluss litt annet) i headere er ofte en god måte å kode på, men du kan godt legge innholdet i headeren inn i main.cpp (som er det samme #include gjør) og få samme resultat.

 

Håper det hjalp

Endret av Giddion
Lenke til kommentar
Problemet er at du gjennom å #include io.cpp blir det definert innholdet i f. eks. WriteAnswer ( alt inni {} ) og det må ikke være flere steder i koden, men det å definere en prototype av funksjonen ""int ReadNumber();" er helt greit og det kan ligger så mange steder du bare vil i koden.

Det jeg ikke skjønner er hvor f.eks WriteAnser (og alt inni funksjonen) er definert to ganger, da jeg bare har brukt det en gang i io.cpp?

 

EDIT: Kan jeg bruke int ReadNumber () og void WriteAnswer() i main, uten å måtte bruke header eller å inkludere (#include) noe på topp?

EDIT2: Det fungerte ja! Men hva er mest ryddig / den beste måten å gjøre det på, prototype eller header?

Endret av Todda7
Lenke til kommentar
Problemet er at du gjennom å #include io.cpp blir det definert innholdet i f. eks. WriteAnswer ( alt inni {} ) og det må ikke være flere steder i koden, men det å definere en prototype av funksjonen ""int ReadNumber();" er helt greit og det kan ligger så mange steder du bare vil i koden.

Det jeg ikke skjønner er hvor f.eks WriteAnser (og alt inni funksjonen) er definert to ganger, da jeg bare har brukt det en gang i io.cpp?

Det er definert i io.cpp, men siden du bruker #include "io.cpp" blir hele innholdet fra io.cpp kopiert inn i mail.cpp og da er funksjonen definert i io.cpp og main.cpp

 

EDIT: Kan jeg bruke int ReadNumber () og void WriteAnswer() i main, uten å måtte bruke header eller å inkludere (#include) noe på topp?

EDIT2: Det fungerte ja! Men hva er mest ryddig / den beste måten å gjøre det på, prototype eller header?

 

Hva som er mest ryddig er den beste måten og det varierer fra person til person, men det jeg har oppfattet som det mest normale/beste er å legge prototyper av funksjoner/klasser i headeren og så funksjonene i source filen (med samme navn) Det at prototypene bare ligger et sted (i headeren) gjør det også enklere å vedlikeholde.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...