[英]C++ pointer or header issues
我有一個主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)之前,它們都返回原始區域。
有什么我不理解我的指針或頭文件?
謝謝!
問題是在子類中有單獨的width
和length
成員變量。 因此子類中的getArea
函數將使用這些變量而不是基類中的變量。
問題是在Shape中你有widht和height,但也有Rectangle類和Triangle類。 這意味着在Triangle的每個實例中,你有2個變量Width和height(Shape :: width和Triangle :: width),因為你的函數setValues是形狀的,它將修改shape類中的變量,getArea是在矩形類所以它將使用Rectangle中的變量)
解決方案是在Rectangle和Triangle中刪除這些重復變量。
您的Triangle
和Rectangle
形狀定義它們自己的length
和width
值,這會隱藏Shape
的length
和width
。 但是Shape
並沒有意識到這一點 - 當你使用setValues
它會設置基類的變量。 但是你的getArea
將使用子類值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.