在两个以上类的对象之间重载operator =

时间:2013-04-13 20:17:48

标签: c++ class operator-overloading

我为我的应用程序定义了三个类:int2_(整数对),float2_(浮点数对)和double2_(双精度对偶),基本上用于复杂算术运算。

我想在上述三个类的对象之间重载赋值=运算符。我的动机是编写CUDA代码,但似乎没有为CUDA类int2float2double2定义赋值运算符。

我目前的实施如下:

class int2_ {

    public:
        int x;
        int y;

        int2_() : x(), y() {}

        // Stuff
        const int2_& operator=(const float2_ a)     { int2_ b;  b.x = (int)a.x;             b.y = (int)a.y;     return b; }
        const int2_& operator=(const double2_ a)    { int2_ b;  b.x = (int)a.x;             b.y = (int)a.y;     return b; }
};

class float2_ {

    public:
        float x;
        float y;

        float2_() : x(), y() {}

        // Stuff
        const float2_& operator=(const double2_ a)  { float2_ b;    b.x = (float)a.x;       b.y = (float)a.y;   return b; }
};

class double2_ {

    public:
        double x;
        double y;

        double2_() : x(), y() {}

        // Stuff
};

所有内容都归纳为 stuff 不提供编译错误。剩余的运算符重载会返回以下错误

error : identifier "float2_" is undefined
error : identifier "double2_" is undefined  
error : identifier "double2_" is undefined  

分别针对三种不同的重载。

似乎存在“可见性”问题,因为例如float2_double2_尚未在int2_类定义之前定义。关于如何解决问题的任何建议?非常感谢你提前。

解决James KANZE和ALEXRIDER的答案后的解决方案

以下是解决方案:

class int2_;
class float2_;
class double2_;

class int2_ {

    public:
        int x;
        int y;

        int2_() : x(), y() {}

        inline const int2_& operator=(const int a)          { x = a;            y = 0.;         return *this; }
        inline const int2_& operator=(const float a)        { x = (int)a;       y = 0.;         return *this; }
        inline const int2_& operator=(const double a)       { x = (int)a;       y = 0.;         return *this; }
        inline const int2_& operator=(const int2_ a)        { x = a.x;          y = a.y;        return *this; }
        inline const int2_& operator=(const float2_ a);
        inline const int2_& operator=(const double2_ a);
};

class float2_ {

    public:
        float x;
        float y;

        float2_() : x(), y() {}

        inline const float2_& operator=(const int a)        { x = (float)a;     y = 0.;         return *this; }
        inline const float2_& operator=(const float a)      { x = a;            y = 0.;         return *this; }
        inline const float2_& operator=(const double a) { x = (float)a;     y = 0.;         return *this; }
        inline const float2_& operator=(const int2_ a)      { x = (float)a.x;   y = (float)a.y; return *this; }
        inline const float2_& operator=(const float2_ a)    { x = a.x;          y = a.y;        return *this; }
        inline const float2_& operator=(const double2_ a);
};

class double2_ {

    public:
        double x;
        double y;

        double2_() : x(), y() {}

        inline const double2_& operator=(const int a)       { x = (double)a;    y = 0.;         return *this; }
        inline const double2_& operator=(const float a) { x = (double)a;    y = 0.;         return *this; }
        inline const double2_& operator=(const double a)    { x = a;            y = 0.;         return *this; }
        inline const double2_& operator=(const int2_ a) { x = (double)a.x;  y = (double)a.y;return *this; }
        inline const double2_& operator=(const float2_ a)   { x = (double)a.x;  y = (double)a.y;return *this; }
        inline const double2_& operator=(const double2_ a)  { x = a.x;          y = a.y;        return *this; }

};

        inline const int2_& int2_::operator=(const float2_ a)       { x = (int)a.x;             y = (int)a.y;       return *this; }
        inline const int2_& int2_::operator=(const double2_ a)      { x = (int)a.x;             y = (int)a.y;       return *this; }
        inline const float2_& float2_::operator=(const double2_ a)  { x = (float)a.x;           y = (float)a.y;     return *this; }

3 个答案:

答案 0 :(得分:2)

首先,您需要使用类的前向声明:

class Int2;
class Float2;
class Double2;

然后,在类中,您应该只声​​明函数,而不是 实施它们。实施应该在所有之后 类定义,在单独的源文件中,或 明确声明内联。

答案 1 :(得分:1)

您需要更改类声明的顺序如下 在这种情况下,前向声明将无济于事,因为您需要声明要在operator =

中使用的类型
class double2_ {

    public:
        double x;
        double y;

        double2_() : x(), y() {}

        // Stuff
};

class float2_ {

    public:
        float x;
        float y;

        float2_() : x(), y() {}

        // Stuff
        const float2_& operator=(const double2_ a)  { float2_ b;    b.x = (float)a.x;       b.y = (float)a.y;   return b; }
};


class int2_ {

    public:
        int x;
        int y;

        int2_() : x(), y() {}

        // Stuff
        const int2_& operator=(const float2_ a)     { int2_ b;  b.x = (int)a.x;             b.y = (int)a.y;     return b; }
        const int2_& operator=(const double2_ a)    { int2_ b;  b.x = (int)a.x;             b.y = (int)a.y;     return b; }
};

还有operator =本身的问题,它应该返回* this;而不是在操作员=完成工作后将立即超出范围的b。

答案 2 :(得分:0)

问题是float2_仅在int2_之后定义,它已被使用。 添加这两个类的前向声明,你应该没问题:

class int2_;
class double2_;