2016-04-13 3 views
1

Ich werde ein Programm schreiben, die virtuelle Funktion mit einer Polygonberechnung zu tun, aber nachdem ich das Programm beenden, gibt es BLOCK_TYPE_IS_VALID (pHead -> nBlockUse) FehlerBLOCK_TYPE_IS_VALID (pHead -> nBlockUse) Fehler

// pointers to base class 
#include <iostream> 
#include "Polygon.h" 
#include "Rectangle.h" 
#include "Triangle.h" 

using namespace std; 

int main() { 
Rectangle rect1(4, 5); 
Rectangle rect2(3, 3); 
Triangle tri(4, 4, false); 
int triLength[3] = { 5, 4, 3 }; 
tri.setsideLength(triLength); 

Polygon * p = &rect1; 
cout << "Rectangle 1: " << endl; 
cout << "\tArea: " << p->area() << endl; 
cout << "\tSide: "; 
p->printsideLength(); 
rect1.printsideLength(); 
cout << "\tTotal Side Length: " << p->totalsideLength() << endl; 
p = &rect2; 
cout << "Rectangle 2: " << endl; 
cout << "\tArea: " << p->area() << endl; 
cout << "\tSide: "; 
p->printsideLength(); 
rect2.printsideLength(); 
cout << "\tTotal Side Length: " << p->totalsideLength() << endl; 
p = &tri; 
cout << "Triangle: " << endl; 
cout << "\tArea: " << p->area() << endl; 
cout << "\tSide: "; 
p->printsideLength(); 
cout << "\tTotal Side Length: " << p->totalsideLength() << endl; 
system("pause"); 
return 0; 
} 

Hier ist die main.cpp des Programms, das Programm keine Notwendigkeit, etwas einzugeben, nur um das Ergebnis zu zeigen.

Hier sind die drei Klassen (CPP & h)

#ifndef Polygon_H 
#define Polygon_H 

#include <iostream> 
using namespace std; 

class Polygon{ 
private: 
int noOfSide; 
bool isAllSideEqual; 
int* sideLength; 
public: 
Polygon(); 
Polygon(int n,bool s); 
~Polygon(); 
void setsideLength(int* sl); 
void printsideLength(); 
int totalsideLength(); 
virtual int area(); 
}; 

#endif 

.

#include "Polygon.h" 
#include <iostream> 
using namespace std; 

Polygon::Polygon(){ 
    noOfSide = 3; 
    isAllSideEqual = false; 
    sideLength = new int[noOfSide]; 
    sideLength = &sideLength[noOfSide]; 
}; 


Polygon::Polygon(int n,bool s){ 
    if (n<3) 
    { 
     noOfSide = 3; 
     isAllSideEqual = false;} 
    else 
    { 
     noOfSide = n; 
     isAllSideEqual = s; 
    }; 
    sideLength = new int[noOfSide]; 
    sideLength = &sideLength[noOfSide]; 

}; 

Polygon::~Polygon(){ 
    delete[] sideLength; 
}; 


void Polygon::setsideLength(int* sl){ 
    for(int i=0;i<noOfSide;i++) 
     sideLength[i] = sl[i]; 
}; 
void Polygon::printsideLength(){ 
    for(int i=0;i<noOfSide;i++) 
     cout << sideLength[i] <<" "; 
}; 

int Polygon::totalsideLength(){ 
    int total = 0; 
    for(int i=0;i<noOfSide;i++) 
     total += sideLength[i]; 
    return total; 
}; 
int Polygon::area(){ 
    return 0; 
}; 

    #ifndef Triangle_H 
    #define Triangle_H 

    #include <iostream> 
    #include "Polygon.h" 
    using namespace std; 

class Triangle:public Polygon 
{ 
private: 
    int width; 
    int height; 
public: 
    Triangle(int w,int h,bool s); 
    virtual int area(); 
}; 
#endif 


#include "Triangle.h" 
#include <iostream> 
    using namespace std; 
Triangle::Triangle(int w,int h,bool s){ 
    width = w; 
    height = h; 
    Polygon(3,s); 
}; 

int Triangle::area(){ 
    int total = 0; 
    total = (width*height)/2; 
    return total; 
}; 


    #ifndef Rectangle_H 
    #define Rectangle_H 

    #include <iostream> 
    #include "Polygon.h" 
    using namespace std; 

    class Rectangle:public Polygon{ 
    private: 
    int width; 
    int height; 
public: 
    Rectangle(int w,int h); 
    void printsideLength(); 
    virtual int area(); 
}; 
#endif 

#include "Rectangle.h" 
#include <iostream> 
using namespace std; 

Rectangle::Rectangle(int w,int h){ 
    width=w; 
    height=h; 
    if(width = height) 
     Polygon(4,true); 
    else 
     Polygon(4,false); 
    int* size =new int[4]; 
    size[0] = width; 
    size[1] = height; 
    size[2] = width; 
    size[3] = height; 
    Polygon::setsideLength(size); 
}; 

void Rectangle::printsideLength(){ 
    for(int i=0;i<2;i++) 
     cout<< width<<" "<<height <<" "; 
}; 

int Rectangle::area(){ 
    int total =0; 
    total = width*height; 
    return total; 
}; 

Das Programm ist ohne Übersetzungsfehler, so das einzige Problem, über den Speicher ist aber wo ist es falsch? ist der virtuelle Funktionsteil falsch oder ein anderer Teil?

Antwort

1

Es gibt mehrere Probleme.

In Ihrem Polygon Konstrukteure, die zweite Zeile in

sideLength = new int[noOfSide]; 
sideLength = &sideLength[noOfSide]; 

ist der Haupt Bug.
Es macht sideLength Punkt über das Ende des Speichers, den Sie gerade zugewiesen haben.
Die Verwendung dieses Zeigers ist nicht definiert.
Sie kopieren beide später an diesen Speicherort und übergeben sie an delete, die beide ungültig sind.
Sie benötigen nur sideLength = new int[noOfSide];.
Sie benötigen außerdem einen richtigen Kopierkonstruktor und Zuweisungsoperator, da die Klasse Speicher manuell verwaltet.

(Was Sie wirklich tun sollten, ist std::vector<int> verwenden und sich Gedanken über die Speicherbelegung zu stoppen.)

In der Unterklasse Bauer, Polygon(3,s); und dergleichen nicht Ihre Basisklasse initialisieren, sie eine unbenannte Polygon schaffen, wird sofort verworfen.

Sie sollten die Basisklasse in der initialiser Liste (zusammen mit den anderen Mitgliedern) initialisieren:

Triangle::Triangle(int w, int h, bool s) 
    : Polygon(3, s), 
    width(w), 
    height(h) 
{ 
} 

Rectangle ‚s Konstruktor hat das gleiche Problem, mit dem zusätzlichen Problem Ihrer Verwendung Zuordnung, =, wo Sie sollten Gleichheit verwenden, ==.
(Ihr Compiler können Sie darüber warnen, wenn Sie seine Warnungen aktivieren. Tun Sie das, und ihnen zuhören.)

Rectangle::Rectangle(int w, int h) 
    : Polygon(4, w == h), 
    width(w), 
    height(h) 
{ 
    int size[] = {width, height, width, height}; 
    setsideLength(size); 
} 
+0

für die Seitenlänge Teil ist das Programm ein dynamisches Integer-Array erstellen müssen mit der Größe entspricht die Anzahl der Seiten und speichern Sie die Adresse des Arrays auf den Zeiger sideLength. –

+0

um diese Anforderung zu erfüllen, sollte ich einfach ein neues Array erstellen und dann die Adresse sideLength zuweisen? wie int * array = neuer int [noOfSide]; sideLength = & Array? –

+0

@TomFong "ein neues Array erstellen und dann sideLength die Adresse zuweisen" ist genau das, was 'sideLength = new int [noOfSide];' tut und das sollten Sie tun. – molbdnilo

Verwandte Themen