C ++指针或头问题

时间:2016-05-01 08:12:08

标签: c++ pointers header-files

我有一个主要cpp文件有

的示例程序
    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;
}

矩形,三角形和形状的头文件如下:

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文件如下:

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;
}

我的思路是因为三角形和矩形从Shape继承,我将rectangle1设置为指向矩形对象而triangle1指向三角形对象,一旦使用默认构造函数值创建了2个形状,我调用setValue ()(对于从Shape继承的所有对象都可以使用。这应该将每个形状的长度和宽度值更改为3,3,当我为每个形状实例运行getArea时,矩形应该返回3 * 3并且三角形应返回3 * 1.5。但是,它们都会在我调用setValues(25和10)之前返回原始区域。

我是否对我的指针或头文件一无所知?

谢谢!

3 个答案:

答案 0 :(得分:1)

问题是您在类中有单独的widthlength成员变量。因此子类中的getArea函数将使用这些变量而不是基类中的变量。

答案 1 :(得分:1)

问题是在Shape中你有widht和height,但也有Rectangle类和Triangle类。这意味着在Triangle的每个实例中,你有2个变量Width和height(Shape :: width和Triangle :: width),因为你的函数setValues是形状的,它将修改shape类中的变量,getArea是在矩形类,因此它将使用Rectangle中的变量

解决方案是在Rectangle和Triangle中删除这些重复变量。

答案 2 :(得分:1)

您的TriangleRectangle形状定义了自己的lengthwidth值,隐藏了Shape的{​​{1}}和{{ 1}}。但length并未意识到这一点 - 当您使用width时,它会设置基类的变量。但是您的Shape将使用子类值。