首页 > 解决方案 > 继承(基本级别)询问用户宽度和高度的最佳方式是什么?(形状示例)

问题描述

我制作这个程序是为了更好地理解继承。

现在我处于这个基本级别,这并不是一个真正的问题,但我可以看到未来会出现这种情况,所以我问什么是要求用户插入矩形的宽度和高度的最佳方法(在这种情况下)。

我提供的代码包括简单的方法,只需询问用户并将数字插入变量中,然后将变量传递给对象(rect1)内的设置器。

我想当我添加更多形状时,这可能会变得有点混乱,有没有更好的方法可以让用户输入数字?

主.cpp:

int main() {
    Rectangle rect1;
    int width, height;

    std::cout << "Insert the width of the rectangle: ";
    std::cin >> width;

    std::cout << "Insert the height of the rectangle: ";
    std::cin >>height;

    rect1.setHeight(height);
    rect1.setWidth(width);

    std::cout << "The area of the rectangle is: " << rect1.getArea() << std::endl;


    std::cout << "Drawing: " << std::endl;
    std::cout << " ";
    for (int i = 0; i < width+1; ++i) {
        std::cout << "-";
    }
    std::cout << std::endl;
    for (int j = 0; j < (height+1)/2; ++j) { // divided by 2 to have a better proportion
        std::cout << "|";
        for (int i = 0; i < width+1; ++i) {
            std::cout << " ";
        }
        std::cout << "|";
        std::cout << std::endl;
    }
    std::cout << " ";
    for (int i = 0; i < width+1; ++i) {
        std::cout << "-";
    }

    return 0;
}

形状.h:

class Shape {
public:
    int getWidth() const {
        return width;
    }

    void setWidth(int width) {
        Shape::width = width;
    }

    int getHeight() const {
        return height;
    }

    void setHeight(int height) {
        Shape::height = height;
    }

protected:
    int width, height;
};

矩形.h:

class Rectangle: public Shape {
public:
    int getArea(){
        return width*height;
    }
};

例如,我正在考虑创建另一个名为“askHeight”的方法,它与 setter 相同,只是它内部已经有coutcin

谢谢大家!:)

META PS 我之前已经在这里问过,没有任何答案有人说我应该在 Code Review 上问,所以我这样做了,删除了旧问题。在 Code Review 上,他们说我应该在这里问。我在 Code Review 上留下了这个问题,然后在这里再次询问,看看我可以在哪一个中得到答案。并且:-是的,我阅读了所有指南-是的,我尝试问了 3 次-是的,我是初学者,在这里和编码

标签: c++inheritanceshapes

解决方案


您正在寻找潜在的问题,这很好。但是,您解决这些问题的方法本身就有问题。

您正在考虑“询问用户并[对数据结构做某事]”。这部分代码是将用户界面连接到数据结构的粘合剂。它应该是你设计的最后一部分,而不是第一部分。首先分别设计您的用户界面和数据结构。(警告:不要根据可能发生的事情进行过度设计。如果未来不确定,不要牺牲现在。让修改代码变得容易;不要尝试编写永远不需要修改的代码。)

设计一个理想的用户界面,而不考虑如何实现它。在你有一个要努力的理想之后,你可以弄清楚你将如何实现它。不用担心如何执行用户触发的操作;专注于从用户那里获得这些触发器。例如,您可以提供一种输入高度和宽度的方法,而无需考虑如何将这些值传递给形状。(如果您正在编写代码或伪代码,这里会有一个空白需要稍后填补。)您可能需要稍微妥协一下理想,尤其是在您刚开始的时候。有时候是这样的。

根据您需要的功能设计数据结构。这部分基于您想要的用户界面,但关注功能而不是如何触发该功能。使结构易于使用,但不要担心如何从界面访问它们。

然后,在你勾画出接口和数据结构之后,弄清楚你希望它们如何协同工作。你可能会发现你想在数据结构中添加新的功能,只要你坚持你的设计原则就可以了。(也许每个类都应该有一个static方法来提示用户输入并生成一个对象。不过,这可能会将一些接口代码转换为类代码,所以要深思熟虑并保持一致。)您可能会发现您想要修改接口,即只要收益大于损失就可以。有时实体需要妥协才能相处,但应该允许每个实体保持其核心完整性。

为用户设计界面。设计功能的结构。最后设计胶水。


推荐阅读