簡體   English   中英

C ++指針或頭問題

[英]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)之前,它們都返回原始區域。

有什么我不理解我的指針或頭文件?

謝謝!

問題是在類中有單獨的widthlength成員變量。 因此子類中的getArea函數將使用這些變量而不是基類中的變量。

問題是在Shape中你有widht和height,但也有Rectangle類和Triangle類。 這意味着在Triangle的每個實例中,你有2個變量Width和height(Shape :: width和Triangle :: width),因為你的函數setValues是形狀的,它將修改shape類中的變量,getArea是在矩形類所以它將使用Rectangle中的變量)

解決方案是在Rectangle和Triangle中刪除這些重復變量。

您的TriangleRectangle形狀定義它們自己的lengthwidth值,這會隱藏Shapelengthwidth 但是Shape並沒有意識到這一點 - 當你使用setValues它會設置基類的變量。 但是你的getArea將使用子類值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM