2016-04-19 6 views
0

Ich muss eine Klasse Shape mit Unterklassen für bestimmte Formen, die Volumen finden. Wir müssen die Objekte konstruieren und in einer verketteten Liste speichern können. Ich teste gerade das Erstellen eines Objekts und frage mich, warum es meine Funktion Cout-Befehle nicht ausführt. Jede Hilfe würde sehr geschätzt werden. DankC++ - verkettete Liste/Polymorphie nicht laufende Liste Funktion

#include <iostream> 
#include <array> 

using namespace std; 

class Shape{ 
public: 
    friend class my_list; 
    Shape(double a=0,double b=0 ,double c=0):width(a),height(b),length(c){ 
    } 

protected: 
    double width; 
    double height; 
    double length; 
    Shape *nextPtr; 
}; 

class Rectangle:public Shape 
{ 
public: 
    Rectangle(double a, double b,double c):Shape(a,b,c){ 
     area = width * length; 
    }; 

private: 
    double area; 
}; 

class Circle:public Shape 
{ 
public: 
    Circle(double a):Shape(a){ 
     area = (radius*radius)*3.14; 
    } 
protected: 
    double area; 
    double radius; 
}; 

class Triangle:public Shape 
{ 
public: 
    Triangle(double a, double b,double c):Shape(a,b,c){ 
     area = .5*width*length; 
    }; 
protected: 
    double area; 
}; 

class Cubic:public Rectangle 
{ 
public: 
    Cubic(double a, double b,double c):Rectangle(a,b,c){ 
     volume = width * length * height; 
    }; 
protected: 
    double volume; 
}; 

class Sphere:public Circle 
{ 
public: 
    Sphere(double a):Circle(a){ 
     volume = (width*width*width)*(4/3)*3.14; 
    }; 
protected: 
    double volume; 
}; 

class Cone:public Circle{ 
public: 
    Cone(double a, double b):Circle(a){ 
     height = b; 
     volume = 3.14*(width*width)*(height/3); 
    }; 
protected: 
    double volume; 
}; 

class my_list{ 
public: 
    my_list(); 
    ~my_list(); 

    void add_node(Shape*); 
    void print_list(); 
    Shape* make_node(); 

private: 
    Shape* firstPtr; 
    Shape* lastPtr; 
}; 

my_list::my_list():firstPtr(NULL), lastPtr(NULL){} 
my_list::~my_list(){} 

Shape* my_list::make_node(){ 
    cout << "What shape would you like to construct?" << endl; 
    cout << "\t1. Rectangle" << "\n\t2. Triangle" << "\n\t3. Cirlce" << 
    "\n\t4. Cubic" <<"\n\t5. Sphere" << "\n\t6. Cone" << endl; 
    int number; cin >> number; cin.get(); 

    cout << "Enter width/height/length or radius, or radius/height" << endl; 
    double a,b,c; cin >> a; cin>>b; cin>> c; 
    switch (number) { 
     case 1: { 
      Shape *newPtr = new Rectangle(a,b,c); 
      return newPtr; 
     } 

     case 2: { 
      Shape *newPtr = new Triangle(a,b,c); 
      return newPtr; 

     } 

     case 3: { 
      Shape *newPtr = new Circle(a); 
      return newPtr; 
     } 
     case 4: { 
      Shape *newPtr = new Sphere(a); 
      return newPtr; 
     } 
     case 5: { 
      Shape *newPtr = new Cubic(a,b,c); 
      return newPtr; 
     } 

     case 6:{ 
      Shape *newPtr = new Cone(a,b); 
      return newPtr; 
     } 
     default: 
       return 0; 
    } 
} 

void my_list::add_node(Shape* new_node){ 
    if (firstPtr == NULL) // empty list 
     firstPtr = lastPtr = new_node; // nextPtr = NULL by default 
    else { 
     new_node -> nextPtr = firstPtr; 
     firstPtr = new_node; // set first pointer to beginning of the list; 
    } 
} 

int main(){ 
    /* 
    while(true) { 
     cout << endl << endl << "\tSelect the following options" << endl; 
     cout << "\t1. Construct" << "\n\t2. Add" << "\n\t3. Print" << 
     "\n\t4. Quit" << endl; 
     cout << "\tSelection:\t"; 
     int options; cin >> options; cin.get(); // cin leaves newline, cin.get() to cancel it 

     switch (options) { 
      case 1: //construct function 

      case 2: { 
       //add function 
      } 

      case 3: 
       //print function 



      case 4: 
      default: break; 
     } 
    } 
    */ 

    my_list l1; 
    l1.add_node(l1.make_node()); 
} 
+0

Definieren Sie "warum es meine Funktion Cout-Befehle nicht ausführt". –

+0

Sie verwenden keinen Laufzeit-Polymorphismus: Es tritt nur für 'virtuelle' Funktionen ein. Machen Sie etwas googeln/Hintergrundlesen - Sie werden viele Seiten finden, die Arbeitscode für 'Form'-abgeleitete Klassen geben. –

+0

Ihre 'Shape' Klasse benötigt einen virtuellen Destruktor. Ohne dieses Verhalten ist das Verhalten nicht definiert, wenn Sie ein abgeleitetes Shape-Objekt mit einem Shape-Zeiger löschen. – PaulMcKenzie

Antwort

0

paar Hinweise:

  1. versuchen, ein Objekt von my_list Erstellen, bevor Sie Funktionen auf sie anrufen. wie meine_liste l1 = neu meine_liste();

  2. In der Switch-Case-Nutzung verwenden Sie Pause statt Rückkehr. wie:

    Schalter (n) { Fall 1: ... break;

    Fall 2: ... Bruch; }

3.Start eine IDE und fügen Sie Haltepunkte für die Fehlersuche verwenden.