运算符重载,使用char

时间:2015-06-10 18:42:18

标签: c++ operator-overloading

我想使用运算符重载来制作库存管理程序

例如,如果出售一种纸巾,我想使用'tissue- = 1'进行操作

我为产品库存制作了一个数组P = {1,2,3,4,5},用于组织,日历,扇子,书,笔

我的部分代码(用于测试)是:

#include<iostream>
#include<string>

using namespace std;

class A{
   public:
      static int p[];
      int operator-(string &a){
         if (strcmp(a, "tissue")==0)
            return p[0]-=1;
         else
            cout<<"error"<<endl;
      }

};

int A::p[]={1,2,3,4,5}

int main(){
   A AA;
   "tissue"-=1;
   return 0;
}

我尽力做初学者..我知道代码非常奇怪,请告诉我任何我错过的信息

1 个答案:

答案 0 :(得分:3)

如果我理解得很好,你想要:

  • AA是对象的容器:p[0]将包含&#34; tissue&#34;,p[1]数量&#34; calendar&#34;等...
  • 通过使用其名称来实现将减少此容器中对象数量的运算符。

关于解决当前问题:

不幸的是,您的运算符重载int operator-(string &a)可能会从A中减去字符串值并返回int

所以在main()你应该写:

AA - "tissue";  

略微改进您的方法:

operator-产生副作用的事实非常奇怪。当你写x-1时,你不希望x被改变,是吗?因此,我建议使用预期会产生副作用的运算符来提高代码的可读性。

顺便说一下,我也使用像C ++字符串这样的字符串,而不是像c字符串那样。

  A& operator-= (string &a) {
     if (a == "tissue")
        p[0]-=1;    // p[0]-- would be an alternative as well ;-)
     else if (a=="calendar") 
        p[1]-=1; 
     //etc... 
     else
        cout<<"error"<<endl;
     return *this; 
  }

我认为你的问题只是学习如何使用操作员过载,而不是用于生产质量代码。在这种情况下,这种方法很好。

更进一步:

实际上,您尝试以自己的方式实现的是一种关联容器。幸运的是,这已经存在于带有 std::map

的标准C ++中

您的所有代码都可以替换为:

map<string, int> AA; 
AA["tissue"]++; 
AA["calendar"]+=10; 
AA["fan"] = AA["calendar"]*2;
cout << "I have "<<AA["tissue"] <<" tissues in stock"<<endl;