【问题标题】:Generic function for two different classes两个不同类的通用函数
【发布时间】:2013-11-15 05:55:55
【问题描述】:

我正在尝试创建一个通用函数,它接收同一个类的两个对象并返回同一个对象

这是我的两个课程:Point2DPoint3D

class Point2D
{
 public:
           Point2D();
           Point2D(int,int);

           int getX() const;
           int getY() const;

           void setX(int);
           void setY(int);

 protected:

             int x;
             int y;
};



class Point3D:public Point2D
{
  public:   Point3D();
            Point3D(int,int,int);

            void setZ(int);

            int getZ() const;

  protected:
             int z;
};

对于 Point2D:我试图返回一个 Point2D 对象,其 X、Y 坐标是 2 个 Point2D 对象之间的差异

对于 Point3D :我试图返回一个 Point3D 对象,其 X、Y、Z 坐标是 2 个 Point3D 对象之间的差异

我可以创建一个通用函数来处理这两个吗??? .

以下是我目前所拥有的,但它只处理 Point2D 对象,我如何将 Point3D 对象集成到下面的通用函数中

模板 T PointDiff(T pt1, T pt2)
{
T pt3;

pt3.x = pt1.x - pt2.x;

pt3.y = pt1.y - pt2.y;

返回 pt3;
}

我在想这样的事情,但问题是 Point2D 对象没有 Z 坐标

模板 T PointDiff(T pt1, T pt2) {
T pt3;

pt3.x = pt1.x - pt2.x;

pt3.y = pt1.y - pt2.y;

pt3.z = pt1.z - pt2.z

返回 pt3; }

谁能帮帮我,谢谢

【问题讨论】:

  • 搜索模板专业化。 iirc(很久没写C++了)你可以对某些类型参数有一个明确的专业化。但是我只是想知道您为什么要在这里使用模板方法?...
  • 哈哈这是一个家庭作业问题,因此必须这样做

标签: c++ class debugging templates generics


【解决方案1】:

我认为你可以为每个类设置一个 Diff Function。

对于 Point2D 类:

Point2d Diff(Point2D &d) {
    Point2d pt;
    pt.x = this->x - d.x;
    pt.y = this->y - d.y;
    return pt;
} 

对于 Point3D 类:

Point3d Diff(Point3D &d) {
    Point3d pt;
    pt.x = this->x - d.x;
    pt.y = this->y - d.y;
    pt.z = this->z - d.z;
    return pt;
} 

那么,你的函数是这样写的:

template T PointDiff(T pt1, T pt2) {
        return pt1.Diff(pt2);
}

希望对你有所帮助。

【讨论】:

  • 为每个类设置一个 Diff 函数,是否意味着我将 Diff 函数添加到类中??
  • 是的,您将 Diff 函数添加到 Point2D 和 Point3D 类中。
【解决方案2】:

您可以覆盖每个类的减号运算符:

Point2D operator-(Point2D &pt1, Point2D &pt2)
{
    Point2D ret;

    ret.x = pt1.x - pt2.x;
    ret.y = pt2.y - pt2.y;

    return ret;
}

Point3D operator-(Point3D &pt1, Point3D &pt2)
{
    Point3D ret;

    ret.x = pt1.x - pt2.x;
    ret.y = pt2.y - pt2.y;
    ret.z = pt1.z - pt2.z;

    return ret;
}

您还需要将operator- 声明为这两个类的朋友:

class Point2D
{
public:
    Point2D();
    Point2D(int,int);

    int getX() const;
    int getY() const;

    void setX(int);
    void setY(int);

    friend Point2D operator-(Point2D &pt1, Point2D &pt2);
protected:

    int x;
    int y;
};

class Point3D:public Point2D
{
public:
    Point3D();
    Point3D(int,int,int);

    void setZ(int);

    int getZ() const;

    friend Point3D operator-(Point3D &pt1, Point3D &pt2);
protected:
    int z;
};

然后你可以通过减法在程序中使用它

int main(int argc, char **argv)
{
    Point2D a, b, c;

    a.setX(4);
    a.setY(5);
    b.setX(2);
    b.setY(-10);

    c = a - b;

    std::cout << c.getX() << " " << c.getY() << std::endl;
}

【讨论】:

    猜你喜欢
    • 2017-10-23
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多