C ++ ukazatel nebo hlavičkové problémy

hlasů
1

Mám příklad program, jehož hlavní cpp soubor má

    Rectangle rect(5, 5);
    Triangle tri(5, 5);
    Shape *rectangle1 = ▭
    Shape *triangle1 = &tri;
    rectangle1->setValues(3, 3);
    triangle1->setValues(3, 3);
    int area = rectangle1->getArea();

    std::cout << area << std::endl;
    area = triangle1->getArea();
    std::cout << area << std::endl;

    std::cin.get();

    return 0;
}

Hlavičkové soubory obdélník, trojúhelník a tvaru, jsou následující:

Rectangle.h

#ifndef RECTANGLE_H
#define RECTANGLE_H

#include Shape.h

class Rectangle: public Shape {
public :
    int length;
    int width;
    Rectangle(int length, int width);
    int getArea();
    //Rectangle::~Rectangle(void);
};
#endif

Triangle.h

#ifndef TRIANGLE_H
#define TRIANGLE_H

#include Shape.h

class Triangle: public Shape {
    public :
        int length;
        int width;
        Triangle(int length, int width);
        int getArea();
        //Triangle::~Triangle(void);
};

#endif

Shape.h

#ifndef STDAFX_H
#define STDAFX_H
#ifndef SHAPE_H
#define SHAPE_H
#include <iostream>

class Shape 
{
    protected:
        int width;
        int length;
    public:
        Shape(int length, int width);
        void setValues(int length, int width);
        virtual int getArea() = 0;
};

#endif
#endif

CPP soubory tvaru, obdélník a trojúhelník, jsou následující:

Rectangle.cpp

#include stdafx.h
#include Rectangle.h
Rectangle::Rectangle(int length, int width): length(length), width(width), Shape(length, width)
{
}
    int Rectangle::getArea() {
        return length * width;
    }

Triangle.cpp

#include stdafx.h
#include Triangle.h
Triangle::Triangle(int length, int width): length(length), width(width), Shape(length, width)
{
}
    int Triangle::getArea() 
    {
        return length/2 * width;
    }

Shape.cpp

#include stdafx.h
#include Shape.h
#include <iostream>

Shape::Shape(int length, int width): length(length), width(width) {

}

void Shape::setValues(int length, int width) {
    this->length = length;
    this->width = width;
}

Můj způsob uvažování je, že proto, že trojúhelník a obdélník dědí z tvaru a já nastavit rectangle1 poukázat na objekt obdélníku a triangle1 poukázat na objekt trojúhelníku, jakmile 2 tvary jsou vytvářeny s výchozí hodnoty konstruktérů, volám setValue () ( který by měl být k dispozici pro všechny objekty, které dědí z tvaru. To by mělo měnit délka a šířka hodnoty každý tvar, aby 3, 3, a při spuštění getArea pro každý tvar například obdélník by měl vrátit 3 * 3 a trojúhelník by měl vrátit 3 * 1,5. Nicméně, oba vrátí původní zástavbu od předtím, než jsem zavolal setValues ​​(25 a 10).

Je tu něco, co jsem nechápal, o mé ukazatele nebo hlavičkové soubory?

Dík!

Položena 01/05/2016 v 08:12
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
1

Váš Trianglea Rectangletvarů definovat své vlastní lengtha widthhodnoty, které se skrývají v Shape‚s lengtha width. Ale Shapenení si vědom, že - pokud používáte setValuesnastaví proměnné základní třída je. Ale vaše getAreabude používat hodnoty dítě třídy.

Odpovězeno 01/05/2016 v 08:19
zdroj uživatelem

hlasů
1

Problém je v tom, že se do formy jste šíře a výška, ale také v obdélník třídy a třídy Triangle. To znamená, že v každém případě z trojúhelníku, máte 2 proměnné Šířka a výška (Shape :: šířka a Triangle :: šířka), protože vaše funkce setValues ​​je ve formě, bude to změnit proměnné ve třídě tvaru a getArea je definovat třída obdélník, takže to bude používat proměnné v obdélník)

Řešením by bylo odstranit tyto duplicitní proměnné v obdélníku a trojúhelníku.

Odpovězeno 01/05/2016 v 08:19
zdroj uživatelem

hlasů
1

Problém je v tom, že mají samostatné widtha lengthproměnné členů v dětských třídách. Takže getAreafunkce v dětských třídách budou používat tyto proměnné namísto proměnných ze základní třídy.

Odpovězeno 01/05/2016 v 08:19
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more