Archief - [PROG]C++ Oefening wil niet compileren

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Therif

Legacy Member
Goeiendag...

Ik heb hier een oefening die we in de klas hebben gemaakt, maar het wil niet deftig compileren...

Mss heb ik slecht gecompileert, ik weet het niet, ik heb hulp nodig

Het is niet een of ander taak ofzo, maar het is voor mijn examen, als ik op mijn examen zo een simpel oefening niet kan compileren ben 'k er nog voor 2de zit :'( en dat wil 'k ni :(

het zit zo... 3files(2 .cc en 1 .h)
--het is commandline--
Code:
#ifndef _PERSOON_H_
#define _PERSOON_H_
#include <iostream>
#include <string>

using namespace std;


class Persoon{
private:
	string myNaam;
	unsigned int myLeeftijd;
		
public:
	Persoon();
	Persoon(string naam, unsigned int leeftijd);
	~Persoon();

void jaarOuder();
void setNaam(string naam);
void setLeeftijd(unsigned int leeftijd);

string getNaam() const;
int getLeeftijd() const;
void print() const;

};

#endif /*PERSOON_H_*/

Code:
#include "wc1oef1-persoon.h"

using namespace std;

Persoon::Persoon(string naam, unsigned int leeftijd){
	myNaam = naam;
myLeeftijd = leeftijd;
}
Persoon::~Persoon(){};

void Persoon::jaarOuder(){
	myLeeftijd++;
	
}
void Persoon::setNaam(string naam){
	myNaam = naam;

}
void Persoon::setLeeftijd(unsigned int leeftijd){
	myLeeftijd = leeftijd;
	
}
string Persoon::getNaam() const{
	return myNaam;
	
}
int Persoon::getLeeftijd() const{
	return myLeeftijd;
}
void Persoon::print() const{
	cout << "Naam: " << myNaam << endl << "Leeftijd: " << myLeeftijd << endl;
}
en de main is:
Code:
#include "wc1oef1-persoon.cc"

using namespace std;
int main()
{
	Persoon p1("Alfred", 19);
	Persoon p2("Bert", 20);
	Persoon p3("Cedric",18);
	
	p1.print();
	p2.print();
	p3.print();
	
	p1.jaarOuder();
	p1.print();
}

de fout lijkt op dit:
Code:
Rifton:~/Documents/oef-exam therif$ g++ -Wall -o wc1oef1-oplossing.o wc1oef1-main.cc wc1oef1-persoon.cc
/usr/bin/ld: multiple definitions of symbol Persoon::setLeeftijd(unsigned int)
/var/tmp//ccFLN7aV.o definition of Persoon::setLeeftijd(unsigned int)in section (__TEXT,__text)
/var/tmp//ccB1uVd1.o definition of Persoon::setLeeftijd(unsigned int)in section (__TEXT,__text)
/usr/bin/ld: multiple definitions of symbol __ZN7Persoon11setLeeftijdEj.eh
/var/tmp//ccFLN7aV.o definition of absolute __ZN7Persoon11setLeeftijdEj.eh (value 0x0)
/var/tmp//ccB1uVd1.o definition of absolute __ZN7Persoon11setLeeftijdEj.eh (value 0x0)
/usr/bin/ld: multiple definitions of symbol Persoon::setNaam(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)
/var/tmp//ccFLN7aV.o definition of Persoon::setNaam(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)in section (__TEXT,__text)
/var/tmp//ccB1uVd1.o definition of Persoon::setNaam(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)in section (__TEXT,__text)
/usr/bin/ld: multiple definitions of symbol Persoon::jaarOuder()
/var/tmp//ccFLN7aV.o definition of Persoon::jaarOuder()     in section (__TEXT,__text)
/var/tmp//ccB1uVd1.o definition of Persoon::jaarOuder()     in section (__TEXT,__text)
/usr/bin/ld: multiple definitions of symbol __ZN7Persoon9jaarOuderEv.eh
/var/tmp//ccFLN7aV.o definition of absolute __ZN7Persoon9jaarOuderEv.eh (value 0x0)
/var/tmp//ccB1uVd1.o definition of absolute __ZN7Persoon9jaarOuderEv.eh (value 0x0)
/usr/bin/ld: multiple definitions of symbol Persoon::Persoon(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int)
/var/tmp//ccFLN7aV.o definition of Persoon::Persoon(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int)in section (__TEXT,__text)
/var/tmp//ccB1uVd1.o definition of Persoon::Persoon(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int)in section (__TEXT,__text)
/usr/bin/ld: multiple definitions of symbol Persoon::Persoon(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int)
/var/tmp//ccFLN7aV.o definition of Persoon::Persoon(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int)in section (__TEXT,__text)
/var/tmp//ccB1uVd1.o definition of Persoon::Persoon(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int)in section (__TEXT,__text)
/usr/bin/ld: multiple definitions of symbol Persoon::~Persoon()
/var/tmp//ccFLN7aV.o definition of Persoon::~Persoon()in section (__TEXT,__text)
/var/tmp//ccB1uVd1.o definition of Persoon::~Persoon()in section (__TEXT,__text)
/usr/bin/ld: multiple definitions of symbol Persoon::~Persoon()
/var/tmp//ccFLN7aV.o definition of Persoon::~Persoon()in section (__TEXT,__text)
/var/tmp//ccB1uVd1.o definition of Persoon::~Persoon()in section (__TEXT,__text)
/usr/bin/ld: multiple definitions of symbol Persoon::getLeeftijd() const
/var/tmp//ccFLN7aV.o definition of Persoon::getLeeftijd() const in section (__TEXT,__text)
/var/tmp//ccB1uVd1.o definition of Persoon::getLeeftijd() const in section (__TEXT,__text)
/usr/bin/ld: multiple definitions of symbol __ZNK7Persoon11getLeeftijdEv.eh
/var/tmp//ccFLN7aV.o definition of absolute __ZNK7Persoon11getLeeftijdEv.eh (value 0x0)
/var/tmp//ccB1uVd1.o definition of absolute __ZNK7Persoon11getLeeftijdEv.eh (value 0x0)
/usr/bin/ld: multiple definitions of symbol Persoon::print() const
/var/tmp//ccFLN7aV.o definition of Persoon::print() constin section (__TEXT,__text)
/var/tmp//ccB1uVd1.o definition of Persoon::print() constin section (__TEXT,__text)
/usr/bin/ld: multiple definitions of symbol Persoon::getNaam() const
/var/tmp//ccFLN7aV.o definition of Persoon::getNaam() constin section (__TEXT,__text)
/var/tmp//ccB1uVd1.o definition of Persoon::getNaam() constin section (__TEXT,__text)
collect2: ld returned 1 exit status

kan er iemand mij helpen aub?

oef hier te downloaden

ng

Legacy Member
Wat ik wel al heb gezien is dat in je tweede blokje code en in je main er opnieuw "using namespace std;" staat.
Dat hoeft niet.

Alsook in je main staat daar: #include "wc1oef1-persoon.cc", moet dat niet .cpp zijn?
Al is dit maar een gok.

Therif

Legacy Member
ik heb ondertussen alle using namespace std; verwijderd, en overal waar string,endl en cout stond std::string; std::endl en std::cout gezet...

mijn files zijn .cc dus daar is het probleem niet :)

ng

Legacy Member
Therif, bij mij werkt het wel, als ik er mijn verbeteringen op toepas.

En uw print is geen probleem.

Therif

Legacy Member
is mijn commando om te compileren mss fout?
wat gebruik jij?

ik heb

Rifton:~/Documents/oef-exam therif$ g++ -Wall -o wc1oef1-oplossing.o wc1oef1-main.cc wc1oef1-persoon.cc
gebruikt

Therif

Legacy Member
ah ja, ge hebt gelijk... als 'k het met een c++ programma gebruik die mijn files automatisch compileert en linkt werkt het ook ...

Maar op het examen moet het met het commando g++ ... werken... weet iemand wat mijn fout hierin is?

Tyfius

Legacy Member
In je main() include jij de .cc (#include "wc1oef1-persoon.cc") file, includeer daar eens het .h bestand in de plaats.
Dat zal al veel oplossen.

ng

Legacy Member
nee, da zorgt voor meer problemen.

Da geeft dan dees

Code:
Compiling: H:\maintest.cc
Linking console executable: H:\maintest.exe
H:\maintest.o:maintest.cc:(.text+0x1b7): undefined reference to `Persoon::Persoon(std::string, unsigned int)'
H:\maintest.o:maintest.cc:(.text+0x298): undefined reference to `Persoon::Persoon(std::string, unsigned int)'
H:\maintest.o:maintest.cc:(.text+0x366): undefined reference to `Persoon::Persoon(std::string, unsigned int)'
H:\maintest.o:maintest.cc:(.text+0x3f6): undefined reference to `Persoon::print() const'
H:\maintest.o:maintest.cc:(.text+0x401): undefined reference to `Persoon::print() const'
H:\maintest.o:maintest.cc:(.text+0x40c): undefined reference to `Persoon::print() const'
H:\maintest.o:maintest.cc:(.text+0x417): undefined reference to `Persoon::jaarOuder()'
H:\maintest.o:maintest.cc:(.text+0x422): undefined reference to `Persoon::print() const'
H:\maintest.o:maintest.cc:(.text+0x4cb): undefined reference to `Persoon::~Persoon()'
H:\maintest.o:maintest.cc:(.text+0x4ee): undefined reference to `Persoon::~Persoon()'
H:\maintest.o:maintest.cc:(.text+0x511): undefined reference to `Persoon::~Persoon()'
H:\maintest.o:maintest.cc:(.text+0x534): undefined reference to `Persoon::~Persoon()'
H:\maintest.o:maintest.cc:(.text+0x557): undefined reference to `Persoon::~Persoon()'
H:\maintest.o:maintest.cc:(.text+0x590): more undefined references to `Persoon::~Persoon()' follow
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 0 seconds)
0 errors, 0 warnings

Tyfius

Legacy Member
En toch moet het. De bedoeling van een .h file is om je code af te schermen. Iemand die de main() maakt hoeft alleen je header te includeren en heeft geen belang bij de inhoud van de .cpp file. Lees anders het volgende artikel eens: http://en.wikipedia.org/wiki/Header_file
Wat een #include eigenlijk doet is een groter bestand creëren, hier met de inhoud van persoon.h en main.cc (of in jouw geval persoon.cc). Het is de bedoeling om de broncode te verbergen en alleen de header kenbaar te maken en te distribueren.

Wat je ook best doet is de volgorde respecteren.
Code:
jensen@atlantis:~/Desktop/test$ g++ -Wall main.cpp persoon.cpp -o persoon
jensen@atlantis:~/Desktop/test$ ./persoon 
Naam: Alfred
Leeftijd: 19
Naam: Bert
Leeftijd: 20
Naam: Cedric
Leeftijd: 18
Naam: Alfred
Leeftijd: 20
De enige aanpassing die ik heb gedaan is de include veranderen (en bij het knippen en plakken de bestandsnaam) en eerst de main.cpp aangeduid en dan pas de andere .cpp bestanden.

ng

Legacy Member
Therif zei:
ah ja, ge hebt gelijk... als 'k het met een c++ programma gebruik die mijn files automatisch compileert en linkt werkt het ook ...

Maar op het examen moet het met het commando g++ ... werken... weet iemand wat mijn fout hierin is?

Ik gebruik dat commando om te compileren (cygwin) en dat lukt toch.

zie maar

Tyfius

Legacy Member
night ghost 128 zei:
Ik gebruik dat commando om te compileren (cygwin) en dat lukt toch.

zie maar
Dat is ook omdat jij fout werkt en het bronbestand includeerd, zoals ik in mijn vorige post aangeef. Jij kopieert de inhoud van het bronbestand "test.cc" in dat van "maintest.cc" waardoor jij eigenlijk 1 groot bestand aanmaakt. Daar de klasse persoon in hetzelfde bestand zit moet je dit niet meer meegeven aan de compiler, maar dat is een foute manier van programmeren.

Therif

Legacy Member
idd zoals tyfius zei, het werkt :)

dus de .h heb ik geinclude waar dat nodig was :) (hier dan in de main en in de cc)

bedankt voor snelle antwoorden!

ng

Legacy Member
Tyfius zei:
Dat is ook omdat jij fout werkt en het bronbestand includeerd, zoals ik in mijn vorige post aangeef. Jij kopieert de inhoud van het bronbestand "test.cc" in dat van "maintest.cc" waardoor jij eigenlijk 1 groot bestand aanmaakt. Daar de klasse persoon in hetzelfde bestand zit moet je dit niet meer meegeven aan de compiler, maar dat is een foute manier van programmeren.

ach zo, daarom dat het niet ging toen ik den docent zen oefening wou compileren :p
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan