Problem mit eigener Klasse und Objekten dieser Klasse

Mittlerweile ist es eine Funktion, die eine Gleitkommazahl zurückgibt (Ausschnitt):
Du meinst eine Methode. (Methoden sind spezielle Funktionen, da sie zu einer Klasse gehören)

Ok, dann können wir jetzt ja zum nächsten Thema kommen: Der Additions-Funktion:
Gefordert wird: Eine statische Funktion, welche zwei Vektoren addieren kann und einen Zeiger auf den neuen Vektor zurückgibt.

Wo kommt dieser Fehler jetzt wieder her?
Das ist der gleiche Fehler wie mit der sub Methode, du hast das vektor:: vergessen.

Gruß
 
Der Übersichtlichkeit halber und für alle, die damit auch Probleme haben (eher unwahrscheinlich :D) hier nochmal das komplette Programm.

vektor.h
C++:
#ifndef vektor_H
#define vektor_H
class vektor
{
   public: //konstruktor/destruktor
      vektor(double x, double y, double z);
      ~vektor();

   private: //member
      double x;
      double y;
      double z;

   public:
      void ausgabe() const;
      double getX() const;
      double getY() const;
      double getZ() const;
      double getLength() const;
      double sub(const vektor*, const vektor*) const;
      static vektor* add(const vektor*, const vektor*);

};

#endif

vektor.cpp
C++:
#include "vektor.h"

#include <cmath>
#include <iostream>

vektor::vektor(double inX, double inY, double inZ)
: x(inX)
, y(inY)
, z(inZ)
{

}

vektor::~vektor()
{

}


void vektor::ausgabe() const
{
   std::cout << "X: " << x << std::endl;
   std::cout << "Y: " << y << std::endl;
   std::cout << "Z: " << z << std::endl;
}

double vektor::getX() const
{
	return x; //return the value of "x"
}

double vektor::getY() const
{
	return y; //return the value of "y"	
}

double vektor::getZ() const
{
	return z; //return the value of "z"
}

double vektor::getLength() const
{
	return sqrt(x*x + y*y + z*z);
}

double vektor::sub(const vektor* v1, const vektor* v2) const
{
    return sqrt((v2->getX()-v1->getX())*(v2->getX()-v1->getX())
                + (v2->getY()-v1->getY())*(v2->getY()-v1->getY())
                + (v2->getZ()-v1->getZ())*(v2->getZ()-v1->getZ()));
}

vektor* vektor::add(const vektor* v1, const vektor* v2)
{
    vektor* v3 = new vektor(v1->getX()+v2->getX()
                            , v1->getY()+v2->getY()
                            , v1->getZ()+v2->getZ());
    return v3;
}

main.cpp (Natürlich kann man die Programmausgaben schöner gestalten)
C++:
#include <cstdlib>
#include <iostream>
#include <cmath>
#include "vektor.h"

using namespace std;

int main(int argc, char *argv[])
{
    cout << "hallo" << endl;
	vektor* vektor1 = new vektor(1,1,1);
	vektor1->ausgabe();
	vektor* vektor2 = new vektor(1,2,3);
	vektor2->ausgabe();
	
	cout << "Abstand von Vektor1 zu Vektor2: " << vektor1->sub(vektor1, vektor2) << endl;

    cout << "Wir addieren Vektor1 und Vektor2..." << endl;
    
    vektor* v3 = vektor::add(vektor1, vektor2);
    v3->ausgabe();

    system("PAUSE");
    return EXIT_SUCCESS;
}


Noch eine abschließende Frage: Ist das jetzt sauber implementiert und umgesetzt?

Könnte ich anstatt "#include "vektor.h"" auch "class vektor;" schreiben (Steht so im Skript, funktioniert bei mir aber nicht...)?
 
Moin,

Könnte ich anstatt "#include "vektor.h"" auch "class vektor;" schreiben (Steht so im Skript, funktioniert bei mir aber nicht...)?

ganz eindeutig: nein (!)

(a) "class vektor;" ist schon mal keine korrekte C/C++-Syntax !
(b) mit "class vektor { ... }" (ganz grob vereinfacht!) definierst Du eine neue Klasse, deren Objekte Du instantiieren kannst.
Hierzu werden ja die Dateien vektor.cpp und vektor.h angelegt
(c) Mit der Include-Anweisung teilst Du dem Compiler mit, das er diese Klasse (den Inhalt dieser Datei) an dieser Stelle in den Code rein compilieren soll !
http://www.imb-jena.de/~gmueller/kurse/c_c++/c_includ.html

Gruß
Klaus


BTW: was meinst Du mit "Script"? etwa PHP ?
 
Zuletzt bearbeitet:
Ich tippe dazu mal ein paar Zeilen aus meinem Skript ab:

Forward Declaration

Wenn Sie in einer Klassendefinition Objekte einer anderen Klasse benutzen wollen, müssen Sie dem Compiler den Typen der Klasse bekannt machen. Dies kann "klasisch" über einen Include der ".h-Datei" erfolgen:

Datei a.h
Code:
class A
{
 //irgendeine Klasse
}

Datei b.h
Code:
#include "a.h"
class B
{
 void funktionDieABenutzt(A* objektVonA);
}

Diese Vorgehensweise ist zwar richtig, führt aber zu längeren Kompilierzeiten [...]
Eine simplere Methode ist die Methode der Forward-Declaration. Hier bei wird dem Compiler nur gesagt: "Es gibt eine Klasse, die A heißt":
Datei a.h
Code:
class A
{
 //irgendeine Klasse
}

Datei b.h
Code:
class A;

class B
{
 void funktionDieABenutzt(A* objektVonA);
}
Nutzen Sie diese Methode so oft wie möglich [...]

Ich glaube es hat gerade Klack gemacht.
Bräuchte ich in der Vektor-Klasse noch eine andere selbst-erstellte Klasse von mir, so könnte ich diese andere Klasse in vektor.h mittels "class Klasse;" einbinden. Richtig?
In der Main-Funktion geht dies jedoch nicht.

Habe ich das nun richtig verstanden?
 
Ich glaube es hat gerade Klack gemacht.
Bräuchte ich in der Vektor-Klasse noch eine andere selbst-erstellte Klasse von mir, so könnte ich diese andere Klasse in vektor.h mittels "class Klasse;" einbinden. Richtig?
In der Main-Funktion geht dies jedoch nicht.

Habe ich das nun richtig verstanden?
So ungefähr.

Eine Vorwärtsdeklaration macht die Klasse zwar bekannt, die Klasse ist aber noch nicht vollständig definiert.

Man darf von solchen unvollständig definierten Klassen Zeiger erstellen.

Man kann aber weder ein Objekt dieser Klasse anlegen, noch kann man irgendwelche Methoden aufrufen (da diese Informationen noch nicht verfügbar sind).
C++:
class xyz;

xyz* ptr = 0;
Wenn du also in irgendeiner Form die Klasse benutzen willst, muß die Klassendefinition bekannt sein.

Gruß
 
Gut, ich danke Dir und auch den anderen für deine/eure Geduld!

Das Thema ist dann für mich erstmal erledigt.

Dankesehr!
 
Zurück