error: ISO C++ forbids declaration of 'vector' with no type
-
Hallo. Ich muss mich an der Uni wieder einmal seit langem mit C++ rumschlagen. Dabei erhalte ich immer denselben Fehler und komme einfach nicht weiter: error: ISO C++ forbids declaration of 'vector' with no type. Meiner Meinung nach ist der Typ des vectors aber definiert.
Vielleicht könnt ihr mir da ja helfen:
process.cpp
http://nopaste.com/p/aoxhU7W4Wprocess.h
http://nopaste.com/p/aGkeXxPtuAusserdem bin ich mir nicht sicher, ob das Zusammenspiel mit der *.cpp und *.h sowie dem Klassenaufbau so richtig ist. In der Vorlesung hatten wir zum Teil *.cpp.h Dateien, aber baut man das wirklich so auf?
Vielen Dank für eure Hilfe

-
In der Klassendefinition muss die (4) weg, hier gibst du nur die Member-Variablen an, initialisieren tut man diese im Konstruktor.
-
Tippgeber schrieb:
In der Klassendefinition muss die (4) weg, hier gibst du nur die Member-Variablen an, initialisieren tut man diese im Konstruktor.
Wenn ich stattdessen einfach
vector<Data> db;schreibe, ändert das aber auch nichts an der Fehlermeldung. Oder wie meinst du das?
-
Probleme in Deiner .h-Datei:
- Es gibt keine Headerdatei namens "String" (mit großem S beginnent).
- vector (in Definition von Process) nicht mit std:: qualifiziert
- Initialisierung von db muss im Konstruktor erfolgen, nicht bei der Elementdefinition.
- Destruktor in Process ist überflüssigProbleme in Deiner .cpp-Datei:
- Du setzt einfach argv[1] und argv[2]. Woher weißt du, dass es die gibt? Du hast argc vorher nicht überprüft. Ich bin mir nicht mal sicher, ob man die Zeiger im Array überhaupt ändern darf.
-
Sebastian Pizer schrieb:
Probleme in Deiner .h-Datei:
- Es gibt keine Headerdatei namens "String" (mit großem S beginnent).
- vector (in Definition von Process) nicht mit std:: qualifiziertDanke, Die Fehlermeldung ist schon Mal weg

Sebastian Pizer schrieb:
- Initialisierung von db muss im Konstruktor erfolgen, nicht bei der Elementdefinition.
Was heisst das konkret? Db ist doch ein Klassenattribut und soll es auch bleiben.
Sebastian Pizer schrieb:
- Destruktor in Process ist überflüssig
Das ist in der Aufgabe so vorgegeben

Sebastian Pizer schrieb:
Probleme in Deiner .cpp-Datei:
- Du setzt einfach argv[1] und argv[2]. Woher weißt du, dass es die gibt? Du hast argc vorher nicht überprüft. Ich bin mir nicht mal sicher, ob man die Zeiger im Array überhaupt ändern darf.Das bringt mich schon auf die nächste Frage

In der Aufgabe ist der Aufruf der Methoden mitproc->readFile( argv[1] );vorgegeben. Da ich aber nicht weiss, wie ich die Argumente der main() Funktion angeben kann, habe ich das temporär mal so gelöst. Ich arbeite mit Xcode, wie kann ich diese Argumente dort angeben?Und noch eine weitere Frage:
while (in.good()) { int id; in >> id; string value; in >> value; //db.push_back() }Wie kann ich die Variablen id und value nun dem
vector<Data> db;zuweisen? Einfach so über db.push_back() funktioniert das ja nicht.edit: Die letzte Frage hat sich erledigt, habs gerade selbst rausgefunden

Data datapair = {id, value}; db.push_back(datapair);
-
sili schrieb:
Sebastian Pizer schrieb:
- Initialisierung von db muss im Konstruktor erfolgen, nicht bei der Elementdefinition.
Was heisst das konkret? Db ist doch ein Klassenattribut und soll es auch bleiben.
Hier ist ein Beispiel:
class Klasse { std::vector<int> zahlen; public: Klasse(int x, int y, int z); }; Klasse::Klasse(int x, int y, int z) : zahlen(3) // <-- "Initialisierungsliste" { zahlen[0] = x; zahlen[1] = y; zahlen[2] = z; }sili schrieb:
Sebastian Pizer schrieb:
Probleme in Deiner .cpp-Datei:
- Du setzt einfach argv[1] und argv[2]. Woher weißt du, dass es die gibt? Du hast argc vorher nicht überprüft. Ich bin mir nicht mal sicher, ob man die Zeiger im Array überhaupt ändern darf.Das bringt mich schon auf die nächste Frage

In der Aufgabe ist der Aufruf der Methoden mitproc->readFile( argv[1] );vorgegeben. Da ich aber nicht weiss, wie ich die Argumente der main() Funktion angeben kann, habe ich das temporär mal so gelöst. Ich arbeite mit Xcode, wie kann ich diese Argumente dort angeben?Ich kenne Xcode nicht. In der Kommandozeile kannst Du zumindest Programme mit beliebigen (String-)Parametern aufrufen, die das Betriebssystem an das Programm -- in diesem Fall über argc und argv -- übergibt. Programme sind wie Funktionen benutzbar. Sie nehmen Parameter entgegen und geben einen "Code" zurück, meist 0 für das Signalisieren einer fehlerfreihen Ausführung und sonst irgendwelche Fehlercodes. Du kannst dein Programm über Xcode bestimmt auch mit selbst einstellbaren Parametern starten.
-
Danke für das Beispiel.
Wie man Argumente in Xcode übergeben kann, habe ich inzwischen rausgefunden: Project => Edit active Executable "PROJECTNAME".
Und noch eine letzte Frage:
while (in.good()) { int request_id; in >> request_id; cout << request_id << " "; }Sollte doch eigentlich jede Zeile einmal ausgeben. Allerdings wird die letzte Zeile jeweils doppelt ausgegeben. An was liegt das und wie kann man das beheben?
edit: Habe es jetzt mit einem einfachen
if (!in.eof())behoben.Vielen Dank für deine Hilfe, Sebastian
