Problem med c++-uppgift

Här diskuteras programmering och utveckling
emer
Inlägg: 8
Blev medlem: 25 apr 2008, 17:22
OS: Ubuntu
Utgåva: 12.04 Precise Pangolin LTS

Problem med c++-uppgift

Inlägg 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
Lars
Inlägg: 6191
Blev medlem: 14 jan 2007, 19:31
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Stockholm

Re: Problem med c++-uppgift

Inlägg 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?
emer
Inlägg: 8
Blev medlem: 25 apr 2008, 17:22
OS: Ubuntu
Utgåva: 12.04 Precise Pangolin LTS

Re: Problem med c++-uppgift

Inlägg 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?
Lars
Inlägg: 6191
Blev medlem: 14 jan 2007, 19:31
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Stockholm

Re: Problem med c++-uppgift

Inlägg 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.
emer
Inlägg: 8
Blev medlem: 25 apr 2008, 17:22
OS: Ubuntu
Utgåva: 12.04 Precise Pangolin LTS

Re: Problem med c++-uppgift

Inlägg av emer »

Ok, jag använder Geany som utvecklingsmiljö. Finns det något sätt att lösa detta utan manuel inmatning?
Användarvisningsbild
mcNisse
Inlägg: 5211
Blev medlem: 06 feb 2007, 20:51
OS: Debian
Utgåva: Vet inte/ingen utgåva passar

Re: Problem med c++-uppgift

Inlägg av mcNisse »

skriv ihop en Makefile. http://mrbook.org/tutorials/make/
.
Skriv svar

Återgå till "Programmering och webbdesign"