C++ - linker Probleme mit der statischen Methode
Schreibe ich ein Vector3D-Klasse, ruft eine statische Methode auf eine VectorMath-Klasse, um eine Berechnung durchführen. Wenn ich kompilieren, bekomme ich diese:
bash-3.1$ g++ VectorMath.cpp Vector3D.cpp /tmp/cc5cAPia.o: In function `main': Vector3D.cpp:(.text+0x4f7): undefined reference to 'VectorMath::norm(Vector3D*)' collect2: ld zurückgegeben, 1 exit status
Code:
VectorMath.h:
#ifndef VECTOR3D_H
#include "Vector3D.h"
#endif
class VectorMath {
public:
static Vector3D* calculatePerpendicularVector(Vector3D*, Vector3D*);
static Vector3D* norm(Vector3D*);
static double length(Vector3D*);
};
VectorMath.cpp
#include "VectorMath.h"
Vector3D* norm(Vector3D* vector) { //can't be found by linker
//do vector calculations
return new Vector3D(xHead, yHead, zHead, xTail, yTail, zTail);
}
//other methods
Vector3D.cpp
#include "Vector3D.h"
#include "VectorMath.h"
//...
//vector implementation
//...
int main(void) {
Vector3D* v = new Vector3D(x, y, z);
Vector3D* normVector = VectorMath::norm(v); //error here
}
Warum kann nicht der linker findet die VectorMath::norm
Methode? Auf den ersten Blick würde ich denken, dass ich hätte erklären müssen-norm so:
Vector3D* VectorMath::norm(Vector3D* vector) {
aber nicht geholfen...
- Diese: "aber nicht geholfen..." ist nicht genug Informationen. Was bedeutet das? Gleicher Fehler, andere Fehler?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist, es fehlt:
Den
norm
Funktion ist TeilVectorMath::
. Ohne, dass, Sie müssen nur eine Kostenlose Funktion.Dies ist mehr über Ihr design, aber warum sind Sie mit Zeigern auf alles? Dies ist viel sauberer:
Nehmen Verweise, sind Sie in C++ so nicht schreiben C-code. Was passiert, wenn ich dies nennen?
Wird es entweder Abstürzen, Sie haben, um in eine Prüfung, in diesem Fall, was sollte es zurückgeben? Das ist alles bereinigt, die durch die Verwendung von Referenzen.
Auch, warum nicht nur machen Sie diese Mitglieder des
Vector3D
Klasse?Schließlich stack-Zuweisung Dinge. Dein code jetzt ein Speicherleck hat:
Ändern Sie diese, und verwenden Sie RAII Konzepte:
Sowie durch die
norm
eine member-Funktion beenden Sie mit der sehr saubere code:Keine Zeiger, keine Lecks, alle sexy.
Haben Sie nicht definiert
Vector3D::norm
Methode inVectorMath.cpp
. Stattdessen haben Sie definiert eine Globale Funktion namensnorm
. Was Sie tun müssen, ist, qualifizieren den Namen der Methode, in der definition: