首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用圆形和三角形设计shape类

用圆形和三角形设计shape类
EN

Stack Overflow用户
提问于 2017-06-21 11:49:22
回答 3查看 8.9K关注 0票数 3

我试图理解is-a vs is-like-一种关系,我在某处读到,我们必须尝试遵循这样的设计,即我们总是拥有is-a关系,而不是is-like-a。考虑一下shape基类和派生的三角形和圆形类的经典示例。所以圆是一种形状,三角形也是一种形状。函数显示区域在基类中定义。现在,下面的程序运行良好。

代码语言:javascript
运行
复制
#include "stdafx.h"
#include <cmath>
#include <iostream>

class shape
{
public:
    virtual void displayArea()=0;
};

class circle :public shape
{
    int radius;
public:
    circle(int radius2) :radius(radius2){  }
    void displayArea()
    {
        double area = 3.14*radius*radius;
        std::cout << " \n Area circle" << area<<std::endl;
    }
};

class triangle :public shape
{
    double a,b,c;
public:
    triangle(double a1, double b1, double c1): a(a1), b(b1),c(c1)
    {
        if (a + b > c && a + c > b && b + c > a)
            std::cout << "The sides form a triangle" << std::endl;
        else
            std::cout << "The sides do not form a triangle. Correct me !" << std::endl;
        
    }

    void displayArea()
    {
        double s = (a + b + c) / 2;
        double area = sqrt(s*(s - a)*(s - b)*(s - c));
        std::cout << " \n Area triangle"<< area<<std::endl;
    }
};

void main()
{
    shape * p1[2];
    p1[0]= new circle(20);

    p1[1] = new triangle(5.6,8.1,10.3);
    for (int i = 0; i < 2; ++i)
    {
        p1[i]->displayArea();
    }

    int y;
    std::cin >> y;
}

现在,如果需要实现modifyShape函数,其中形状的每个参数都根据用户的参数进行修改,那么我应该如何更改我的类,以使我的is-a关系不被更改。当我看着它的时候,我觉得我必须在圆形中定义一个参数modifyShape,在三角形中定义一个三参数modifyShape。但是这个函数在基类中应该是什么样子呢?

选项1:我在形状上定义了单参数和双参数modifyShape函数,但这意味着我将在圆形中有一个额外的两个参数函数,在三角形中有一个额外的一个参数函数。

选项2:我在shape中定义了一个可变参数函数modifyShape,但不知何故,这在我看来并不清晰。

EN

Stack Overflow用户

发布于 2017-06-21 12:13:15

还有第三个选项可以使用,您可以创建一个新的类(或结构)层次结构,它将表示每个形状的参数。然后,您可以将指向基类的指针作为参数传递给虚函数。例如:

代码语言:javascript
运行
复制
struct ShapeParams
{
     ...
}

struct TriangleParams : public ShapeParams
{
     double a;
     double b;
     double c:
}
class shape
{
  public:
    virtual void displayArea()=0;
    modifyShape (ShapeParams*) = 0;
};

class triangle :public shape
{
  public:
     void modifyShape (ShapeParams*) = override;

  private:
     TriangleParams m_params;
}
票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44666561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档