【问题标题】:Making operations with a class as an operand possible in C++在 C++ 中使类作为操作数的操作成为可能
【发布时间】:2015-11-29 01:08:01
【问题描述】:

我对运算符重载相当熟悉,但是我想知道我们如何实现这样的东西:

myClass myclassobj;
int x;
x = 5;
x = x + myclassobj

没有办法为 int 类重载 + 运算符,所以应该从 myClass 做一些事情,但我们该怎么做呢?我可能使用了错误的关键字,但通过 SO 搜索并没有导致任何结果。抱歉,如果我做错了什么,这是我在这里的第一篇文章。

编辑 - 我的类是一个自定义矢量类,因此简单地将其转换为给定类型是行不通的。

【问题讨论】:

    标签: c++ class operator-overloading


    【解决方案1】:

    使用签名int operator+(int, myClass) 定义重载运算符。

    【讨论】:

    • 感谢您的快速答复。我是否在 myClass 中定义此运算符?因为当我尝试这样做时,我收到一条错误消息,指出运算符采用 0 或 1 个参数。也许我必须在外面定义它?
    • @DefinitelyNotMe 请看这个帖子:stackoverflow.com/questions/4421706/operator-overloading
    • 谢谢!那肯定会派上用场的。明天早上我会阅读我感兴趣的部分。
    【解决方案2】:

    你是对的。

    没有办法重载int类的+操作符,所以 应该从 myClass 做点什么

    你的问题:

    但是我们该怎么做呢?

    我的回答:

    您应该使用用户定义的类型转换。它可以与转换运算符一起使用。

    #include <iostream>
    
    class myClass
    {
        int i;
    public:
        myClass(int i=0) : i(i) {  }
        operator int(){ // A conversion from myClass to int may solve your problem.
            return i;
        }
    };
    
    int main()
    {
        myClass myclassobj(99);
        int x=7;
        x = 5;
        x = x + myclassobj;
    
        std::cout<<x<<std::endl;
    
        return 0;
    }
    

    Brian 也给出了一个很好的答案,但它仅在重载运算符不需要来自第二个参数的受保护或私有成员或重载运算符声明为 myClass 的朋友时才有效。

    【讨论】:

    • 您好!我知道那会如何工作!不幸的是,在我的例子中,它是一个表示向量的类,并且我的运算符对向量的每个元素执行给定的操作,因此将其转换为整数是不可能的。
    • 1.如果你想用 operator+ 修改 myclassobj,那么第二个参数应该通过非常量引用而不是值传递。 2. 如果该向量在 MyClass 中是私有的或受保护的,则全局 operator+ 应声明为 MyClass 的朋友。下面有一个代码可以帮助你并代表我的意思。
    • #include #include class myClass { std::vector ints; // 这是 myClass 的秘密。 public: myClass(){ } 朋友 int 运算符+(int, myClass&); // operator+(int, myClass&) 是 myClass 的朋友,所以他知道她的秘密。 }; int operator+(int i, myClass& mc){ // mc 是通过非常量引用传递的,所以可以在函数体中修改。 for(int i=0; i
    • 哦,奇迹!正是我想要的东西。
    猜你喜欢
    • 2011-01-31
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2011-12-20
    • 2011-10-06
    • 2017-06-01
    相关资源
    最近更新 更多