2016-04-16 17 views
0

Ich habe ein Problem, auf das ich eine Weile herumgearbeitet habe, um meinen Code effizienter zu machen. Ich habe eine Vector-Klasse erstellt und muss dafür grundlegende Berechnungen durchführen. Die Verwendung einer Vektorbibliothek kommt nicht in Frage, ich muss meine eigene erstellen. Das Problem, das ich derzeit habe, befindet sich in der letzten Phase der Mathematik. Ich kann Werte für den ersten und zweiten Vektor eingeben, aber wenn ich sie addiere, bekomme ich völlig zufällige Zahlen. Ich poste meine Header-Datei und meine cpp-Datei - jede Hilfe wird geschätzt !!Zugreifen auf Klassenzeiger über mehrere Funktionen hinweg

Vectors.h

#include <math.h> 
#include <iostream> 

class Vectors 
{ 
public: 
    Vectors(void); 
    ~Vectors(void); 
    Vectors(double a1, double b1, double c1, double d1) 
    { 
     a = a1; 
     b = b1; 
     c = c1; 
     d = d1; 
    } 
    void VectorAdd(Vectors vector1, Vectors vector2); 
    void VectorSub(); 
    void VectorMulti(); 
    void VectorDiv(); 
    void VectorDP(); 
    void VectorCP(); 
    void setV1(Vectors &vector1); 
    void setV2(Vectors &vector2); 
private: 
    double a; 
    double b; 
    double c; 
    double d; 
    double cp; 
}; 

CPP-Datei

void Vectors::setV1(Vectors &vector1) 
{ 
    Vectors *Vector1 = new Vectors(); 
    std::cout << "Enter the values of the first vector please.\n"; 
    std::cout << "a1: "; 
    std::cin >> Vector1 -> a; 
    std::cout << "b1: "; 
    std::cin >> Vector1 -> b; 
    std::cout << "c1: "; 
    std::cin >> Vector1 -> c; 
    std::cout << "d1: "; 
    std::cin >> Vector1 -> d; 
    Vector1 = &vector1; 
    std::cin.get(); 
    std::cin.get(); 
} 

void Vectors::setV2(Vectors &vector2) 
{ 
    Vectors *Vector2 = new Vectors(); 
    std::cout << "Enter the values of the first vector please.\n"; 
    std::cout << "a1: "; 
    std::cin >> Vector2 -> a; 
    std::cout << "b1: "; 
    std::cin >> Vector2 -> b; 
    std::cout << "c1: "; 
    std::cin >> Vector2 -> c; 
    std::cout << "d1: "; 
    std::cin >> Vector2 -> d; 
    Vector2 = &vector2; 
    std::cin.get(); 
    std::cin.get(); 
} 

void Vectors::VectorAdd(Vectors vector1, Vectors vector2) 
{ 

    setV1(vector1); 
    setV2(vector2); 

    Vectors *Vector3 = new Vectors(); 
    std::cout << "Here is the combination of the two vectors.\n"; 
    Vector3 -> a = vector1.a + vector2.a; 
    std::cout << "a3: " << Vector3 -> a; 
    Vector3 -> b = vector1.b + vector2.b; 
    std::cout << "\nb3: " << Vector3 -> b; 
    Vector3 -> c = vector1.c + vector2.c; 
    std::cout << "\nc3: " << Vector3 -> c; 
    Vector3 -> d = vector1.d + vector2.d; 
    std::cout << "\nd3: " << Vector3 -> d; 
    std::cin.get(); 
    std::cin.get(); 
} 

Vielen Dank im Voraus!

Antwort

1
Vector2 = &vector2; 

Sie haben das rückwärts gemacht. Sie haben den Zeiger auf ein neues Objekt, das Sie gerade initialisiert haben, mit einem Zeiger auf ein vollständig nicht initialisiertes Objekt überschrieben, das Sie hier übergeben haben. Die zufälligen Daten befinden sich natürlich im nicht initialisierten Objekt.

Sie brauchen nicht die

Vectors *Vector2 = new Vectors(); 

an erster Stelle. Initialisieren Sie den Parameter vector2 direkt von std::cin. Dito für die andere Funktion, setV1(), auch. Gleiche Sache.

+0

Vielen Dank! Ich hatte immer Probleme, alle Zeiger zu verstehen, ich muss sie wirklich nochmal durchsehen. – Turkeydipking

0

Ich denke, das Problem hier ist, Sie verwirren mit Zeiger & Referenz.

In void Vectors::setV1(Vectors &vector1) erhalten Sie vector1 als Referenz. Als Nächstes erstellen Sie ein brandneues Objekt Vectors *Vector1 = new Vectors();. Und dann füllen Sie weiterhin *Vector1. Bis zu diesem Punkt sehe ich nichts Seltsames. Dieser Teil Vector1 = &vector1; beschädigt jedoch das Programm vollständig. Sie sind jetzt , die den Zeiger Vector1 mit der eingehenden Adresse vector1 neu zuweisen.

Es sei denn, Sie haben etwas Wert auf den Speicher, wie von vector1 gezeigt, werden Sie nicht die richtigen Ergebnisse haben. Infact Sie haben Glück, wie Sie nicht sagten, Ihr Programm generiert SIGSEGV :)

Verwandte Themen