Vector aus Objekten

Ich habe eine kleine Klasse geschrieben, von der ich in einer anderen Klasse einen Vector anlegen will. Nun habe ich in der header-Datei die entsprechende Klasse auch includet, aber der compiler motzt trotzdem, wenn ich ein Objekt dieser Klasse anlegen will. Muss ich da noch irgendwas anderes machen, um die Klasse in der anderen Klasse nutzen zu können? Beide Klassen haben jeweils eine cpp und eine h-Datei…

Vielen Dank schonmal für die Antworten

Es gibt eine ganze Reihe von Punkten, die man hier falsch machen kann. Vielleicht kannst du einfach die Fehlermeldung des Compilers angeben oder besser noch einen Programmschnipsel in dieses Forum posten.

Wortfuchs

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Nils,

also, das erste, was man falsch machen kann, ist, keinen Default-Constructor für die Klasse anzulegen. Die brauchst du nämlich, wenn du Arrays oder Vektoren dieser Klasse anlegen willst.

Ansonsten schließe ich mich meinem Vorredner an: Poste mal die Fehlermeldung.

Chris

Also die Fehlermeldung lautet:

dataobject’ is used as a type, but is not defined as a type

dataobject heisst die Klasse von der ich gerne einen Vector anlegen würde
Hier ein Codeschnipsel im header der Klasse, in der der vector erstellt werden soll:

#ifndef PARSER_H
#define PARSER_H

#include
#include
#include
#include
#include
#include
#include
#include „dataobject.h“

using namespace std; // put standard names into default namespace

/**
*@author
*/

class parser {

private:

vector dim; // stores content type and size of every field
vector notations; // stores notations left of datafield
vector headline; // stores notations above of datafield
vector dataValues; // stores numeric data of datafield
vector obj;

public:

}

Die anderen vectoren klappen alle, nur den mit den eigenen objekten will er nicht…

Danke schonmal

Nils

Also die Fehlermeldung lautet:

dataobject’ is used as a type, but is not defined as a type

Der Compiler meint, du verwendest einen Typen, den du ihm vorher nicht bekannt gemacht hast.

dataobject heisst die Klasse von der ich gerne einen Vector
anlegen würde
Hier ein Codeschnipsel im header der Klasse, in der der vector
erstellt werden soll:

#ifndef PARSER_H
#define PARSER_H

Zuerst prüfe mal, ob du in der Datei „dataobject.h“ nicht zufällig den Selben include guard verwendest. Das wäre das für mich am nächsten liegende. Vielleicht hast du die Klasse auch in einen eigenen namespace gekapselt!?
Notfalls postest du einen Auszug aus diesem Header.

#include
#include

Die C++ Header haben keine Dateiendung .h

#include
#include

#include
#include

Vorsicht, der folgende Header ist ebenfalls ein C++ Header, den du auch ohne Erweiterung schreiben solltest. In ANSO C gibt es einen Header strings.h, die beiden können flüchtig schnell verwechselt werden.

#include

Also

#include

#include

dito

#include

#include

#include „dataobject.h“

Das solltest du dir tunlichst abgewöhnen, using namespace …; hat in einem Header nicht zu suchen. Den Compiler kümmert das zwar nicht, allerdings macht es das ganze Namespace-Konzept zunichte. => Nur in der .cpp Datei verwenden!

using namespace std; // put standard names into default
namespace

/**
*@author
*/

class parser {

private:

Da im Header keine using namespace verwendet wird, musst du hier die volle Schreibweise anwenden => std::vector

vector dim; // stores content type and size of
every field
vector notations; // stores notations left of
datafield
vector headline; // stores notations above of
datafield
vector dataValues; // stores numeric data of
datafield
vector obj;

public:

}

Die anderen vectoren klappen alle, nur den mit den eigenen
objekten will er nicht…

Ich vermute das Problem im anderen Header.

Markus

>> Erstmal Danek für die Mühe ^^

Der Compiler meint, du verwendest einen Typen, den du ihm
vorher nicht bekannt gemacht hast.

>> Also er kennt es nicht, obwohl ich es per include eingebunden habe?

Zuerst prüfe mal, ob du in der Datei „dataobject.h“ nicht
zufällig den Selben include guard verwendest. Das wäre das für
mich am nächsten liegende. Vielleicht hast du die Klasse auch
in einen eigenen namespace gekapselt!?
Notfalls postest du einen Auszug aus diesem Header.

>> Ähm… Wie erkenne ich denn, dass ich den selben include guard verwende?
>> Am besten ich poste mal einfach den Header von dataobject:

#ifndef DATAOBJECT_H
#define DATAOBJECT_H

#include
#include
#include
#include
#include
#include
#include

class dataObject {

public:

dataObject();
~dataObject();

// ************ Getter & Setter ***************

std::string setName(std::string n);
std::string setNotation(std::string n);
std::string setNotation(std::string n, int i);
double setValue(double d);
double setValue(double d, int i);

std::string getNotation(int i);
double getValue(int i);

private:

// *********** data ************

std::vector notations;
std::vector values;
std::string name;

};

#endif

#include
#include

Die C++ Header haben keine Dateiendung .h

>> Wenn ich das .h wegmache motzt aber mein Comppiler

Das solltest du dir tunlichst abgewöhnen, using namespace …;
hat in einem Header nicht zu suchen. Den Compiler kümmert das
zwar nicht, allerdings macht es das ganze Namespace-Konzept
zunichte. => Nur in der .cpp Datei verwenden!

>> Danke für den Hinweis

>> Viele Grüße

Nils

>> Erstmal Danek für die Mühe ^^

Der Compiler meint, du verwendest einen Typen, den du ihm
vorher nicht bekannt gemacht hast.

>> Also er kennt es nicht, obwohl ich es per include
eingebunden habe?

So sieht es aus …

[…]

class dataObject {

Im anderen Teil hast du versucht, auf eine Klasse dataobject (kleines o) zuzugreifen, hier definierst du aber dataObject (grosses O). Für C++ sind dataobject und dataObject zwei unterschiedliche Dinge. Ändere den anderen Programmteil in std::vector um, dann wird es funktionieren.

[…]

#include
#include

Die C++ Header haben keine Dateiendung .h

>> Wenn ich das .h wegmache motzt aber mein Comppiler

und kommen von ANSI C (nicht C++) und müssen die Endung haben. Sämtliche C++ Header haben keine Endung, zumindest wenn du einen konformen C++ Compiler verwendest.
Genaugenommen kannst du die Standard-Header von ANSI C auch ohne .h einbinden, aus wird dann . Das ist aber an dieser Stelle nicht so wichtig, wichtiger ist, warum du ANSI C Header einbindest: wohl für printf(…), dabei hat C++ doch die tollen streams cout

*sich an den Kopf schlag*

Dow! Das war ja mal echt zu dämlich! Klar! Wenn man natürlich die Klasse anders benennt als das, was man einbinden will! Danke für die Hilfe… peinlich peinlich…

Ich nutze das ganz normale kdevelop von redhat linux.

Viele Grüße

Nils