Sida 1 av 1

Problem med c++-uppgift

Postat: 06 jan 2010, 12:34
av emer
Hejsan! Jag har fått problem med en uppgift i programmeringen som jag hoppas ni kan hjälpa mig med. Uppgiften går ut på att jag ska skapa en enkel filmklass, där man lagrar titeln och längden av filmen.
Klassdiagrammet som visar vad som ska finnas med i koden ser ut så här:

Kod: Markera allt

string titel
int langd
____________________
void geTitel(string t)
void geLangd(int l)
string VisaTitel()
int visaLangd()
void skrivUt()
Klassen film ska implementeras i två filer, en defnitionsfil (.h-fil) och en implementionsfil (.cpp).

Jag ska använda följande huvudprogram för att testa klassen, och den ligger givetvis i main.cpp.

Kod: Markera allt

int main()
{
	vector<Film*> fv;
	fv.push_back(new Film("Star Wars",121));
	fv.push_back(new Film("Plan 9 From Outer Space",79));
	fv.push_back(new Film("Blade Runner",117));
	for(vector<Film*>::iterator i=fv.begin();i!=fv.end();i++)
		(*i)->skrivUt();
	
	return 0;
}
För tillfället ser allt ut så här:

main.cpp

Kod: Markera allt

// main.cpp
#include "Film.h"
#include <iostream>
using namespace std;

int main()
{
	vector<Film*> fv;
	fv.push_back(new Film("Star Wars",121));
	fv.push_back(new Film("Plan 9 From Outer Space",79));
	fv.push_back(new Film("Blade Runner",117));
	for(vector<Film*>::iterator i=fv.begin();i!=fv.end();i++)
		(*i)->skrivUt();
	
	return 0;
}
Film.cpp

Kod: Markera allt

// Filen Film.cpp
#include "Film.h"
#include <iostream>
#include <string>

using namespace std;

void Film::Film(string t, int l) {
	titel=t;
	langd=l;
}

string Film::VisaTitel() {
	return titel;
}

int Film::visaLangd() {
	return langd;
}

void Film::skrivUt() {
	cout<<titel<<" "<<langd<<endl;
}
Film.h

Kod: Markera allt

// Filen Film.h
#ifndef FILM_H
#define FILM_H
#include <string>
using namespace std;

class Film {
	private:
		string titel;
		int langd;		
	public:
	
		void Film(string t, int l);
		string VisaTitel();
		int visaLangd();
		void skrivUt();
};

#endif
Som ni troligtvis ser har jag problem med funktionen "void skrivUt()". Snälla hjälp mig, jag tänker troligtvis helt galet i det fallet. Jag har säkert gjort något fel någon annanstans också, men att jag ersatt "void geTitel..." och "void geLangd.. mot void "Film::Film.." tillät min programmeringslärare.

Hoppas ni kan hjälpa mig iallafall!
Mvh
Emer

Re: Problem med c++-uppgift

Postat: 06 jan 2010, 12:53
av Lars
Vid första anblicken ser det helt ok ut för mig (det var ett tag sedan jag använde C++). Men kompilatorn avslöjar en del fel och det är viktigt att lära sig tolka felmeddelanden.

Kod: Markera allt

g++     film.cpp main.cpp   -o film
In file included from film.cpp:2:
film.h:13: error: return type specification for constructor invalid
film.cpp:8: error: return type specification for constructor invalid
Här klagar den på "void Film(string t, int l)" i både film.h och film.cpp. Ta bort void så fungerar det.

Kod: Markera allt

g++     film.cpp main.cpp   -o film
main.cpp: In function ‘int main()’:
main.cpp:8: error: ‘vector’ was not declared in this scope
main.cpp:8: error: expected primary-expression before ‘*’ token
main.cpp:8: error: expected primary-expression before ‘>’ token
main.cpp:8: error: ‘fv’ was not declared in this scope
main.cpp:12: error: expected primary-expression before ‘*’ token
main.cpp:12: error: expected primary-expression before ‘>’ token
main.cpp:12: error: missing template arguments before ‘i’
main.cpp:12: error: expected ‘;’ before ‘i’
main.cpp:12: error: ‘i’ was not declared in this scope
Det här är egentligen bara ett fel men det leder till en del följdfel. Koncentrera dig på varför den inte känner till vector. Hur löser du det?

Re: Problem med c++-uppgift

Postat: 06 jan 2010, 13:13
av emer
Ah, tack. la till #include <vector> i main.cpp och tog bort void i Film.h och film.cpp och det ser genast bättre ut! Men jag får fortfarande felmedelande:

Kod: Markera allt

g++ -Wall -o "main" "main.cpp" (i sökväg: /home/emil/projekt/Film)
/tmp/ccGKzro3.o: In function `main':
main.cpp:(.text+0x5d): undefined reference to `Film::Film(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)'
main.cpp:(.text+0x128): undefined reference to `Film::Film(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)'
main.cpp:(.text+0x1f3): undefined reference to `Film::Film(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)'
main.cpp:(.text+0x2a0): undefined reference to `Film::skrivUt()'
collect2: ld returned 1 exit status
Kompileringen misslyckades.
Hur gör jag här?

Re: Problem med c++-uppgift

Postat: 06 jan 2010, 13:35
av Lars
Det beror på att du inte länkar med filen Film.cpp. Rätt kommando ska vara "g++ -Wall -o main main.cpp Film.cpp". Om du inte har med Film.cpp så blir ju hela Film-klassen odefinierad.

Kort förklaring av kompilering och länkning: Kommandot g++ main.cpp kompilerar källkodsfilen main.cpp till objektfilen main.o. Kommandot ld -o main main.o länkar sedan objektfilen main.o med diverse standardbibliotek och producerar den exekverbara filen main. Men ofta använder man bara g++ -o main main.cpp för att göra både sakerna på en gång. Det förklarar varför det står "ld returned 1 exit status". Det är alltså länkfasen som har gått fel, inte kompileringsfasen, ibland kan det vara bra att förstå skillnaden.

Re: Problem med c++-uppgift

Postat: 06 jan 2010, 14:57
av emer
Ok, jag använder Geany som utvecklingsmiljö. Finns det något sätt att lösa detta utan manuel inmatning?

Re: Problem med c++-uppgift

Postat: 06 jan 2010, 15:22
av mcNisse
skriv ihop en Makefile. http://mrbook.org/tutorials/make/
.