2017-01-26 2 views
1

Ich schreibe einige Klassen für die Klasse und aus irgendeinem Grund werden meine privaten Variablen irgendwie geändert, nachdem der Konstruktor sie gesetzt hat. In meinem Code werden die x, y-Werte für jede Instanz von Punkt als sehr kleine Zahlen gespeichert, die nicht nahe an dem sind, was sie wirklich sind. Wenn ich nach dem Ausführen des Konstruktors einige der gespeicherten Werte ausbleiche, sind die Werte korrekt, aber beim Aufruf meiner Steilheits- oder Längenfunktion werden ihnen die völlig falschen Werte übergeben, die zu 0 für die Länge und "nan" für die Steigung führen. Irgendeine Idee, warum das passiert?Klassenvariablen werden irgendwie geändert

LineSegment.hpp

#include "Point.hpp" 

#ifndef LineSegment_hpp 
#define LineSegment_hpp 

class LineSegment 
{ 
private: 
    Point endp1; 
    Point endp2; 

    double x_1; 
    double x_2; 
    double y_1; 
    double y_2; 

public: 
    LineSegment(Point p1, Point p2); 
    //SET-METHODS 
    void setEnd1(Point p1); 
    void setEnd2(Point p2); 

    //get-methods 
    Point getEnd1(); 
    Point getEnd2(); 

    //calculations 
    double slope(); 
    double length(); 
}; 
#endif 

LineSegment.cpp

#include "LineSegment.hpp" 
    LineSegment::LineSegment(Point p1, Point p2) 
    { 
     double x_1 = p1.getXCoord(); 
     double y_1 = p1.getYCoord(); 
     setEnd1(p1); 

     double y_2 = p2.getYCoord(); 
     double x_2 = p2.getXCoord(); 
     setEnd1(p2); 
    } 

//set functions 
void LineSegment::setEnd1(Point p1) 
{ 
    Point endp1 = p1; 
} 

void LineSegment::setEnd2(Point p2) 
{ 
    Point endp2 = p2; 
} 

//get-methods 
Point LineSegment:: getEnd1() 
{ 
    return endp1; 
} 

Point LineSegment:: getEnd2() 
{ 
    return endp2; 
} 

//calculations 

double LineSegment::slope() 
{ 
    return (y_2-y_1)/(x_2-x_1); 
} 

double LineSegment::length() 
{ 
    return endp1.distanceTo(endp2); 
} 

Main.cpp

#include "Point.hpp" 
#include "LineSegment.hpp" 
#include <iostream> 

int main() 
{ 
    Point p1(-1.5, 0.0); 
    Point p2(1.5, 4.0); 
    double dist = p1.distanceTo(p2); 

    LineSegment ls1(p1, p2); 

    double length = ls1.length(); 
    std::cout << length << std::endl; 
    double slope = ls1.slope(); 
    std::cout << slope << std::endl; 
} 
+0

Entfernen Sie den gesamten vertikalen Leerraum, der Ihren Code unlesbar macht. –

Antwort

3

Ihre Setter gesetzt lokalen Variablen statt Klassenmitglieder der Einstellung.

Aus irgendeinem Grund deklarieren Sie lokale Variablen mit denselben Namen wie Klassenmitglieder in Ihren Setter-Methoden. Lokale Variablen verbergen Klassenmitglieder. Alle Änderungen, die Sie durchführen, ändern diese lokalen Variablen und lassen die Klassenmitglieder unberührt.

Zum Beispiel, hier

void LineSegment::setEnd1(Point p1) 
{ 
    Point endp1 = p1; 
} 

warum erklären Sie eine lokale Variable Point endp1 wenn Sie Intent wurde (nehme ich an) die Klasse Mitglied zu setzen?

+0

Ich hatte eine Funktion zum Abrufen und Festlegen der Endpunkte. Auch wenn ich sie nicht benutze, kann der Lehrer, wenn er sein eigenes main() enthält. Ich war mir nicht bewusst, dass das Einschließen des Datentyps vor der Variable im Wesentlichen neue deklarierte! So ein Hirn furzen, danke !! –

Verwandte Themen