运算符重载,使用 char
operator overloading, using char
我想使用运算符重载制作库存管理程序
例如,如果出售一种纸巾,我想使用' 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;
}
作为初学者,我尽力了。我知道代码很奇怪,请告诉我我错过的任何事情
如果我理解得很好,你想要:
- AA是对象的容器:
p[0]
将容纳"组织"的数量,p[1]
"日历"的数量,等等...... - 通过使用对象名称实现将减少此容器中对象数量的运算符。
关于解决当前问题:
不幸的是,您的运算符重载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;
}
我想你的问题只是关于学习如何使用运算符重载,而不是关于制作质量代码。 在这种情况下,这种方法很好。
更进一步:
事实上,你试图以自己的方式实现的,是一种联想容器。 幸运的是,这已经存在于标准C++中,std::map
您的所有代码都可以替换为:
map<string, int> AA;
AA["tissue"]++;
AA["calendar"]+=10;
AA["fan"] = AA["calendar"]*2;
cout << "I have "<<AA["tissue"] <<" tissues in stock"<<endl;
相关文章:
- 使用strcpy将char数组的元素复制到另一个数组
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 使用c#访问c++dll中带有char*参数的函数时发生AccessViolationException
- 使用char类型将decimal转换为string,将string转换为decimal
- 使用指针初始化 char 数组或字符串 C++
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 使用 char 分隔符解析C++中的字符串,但将可重复的字符保留为每个解析的子字符串 (C++ STL) 中的分隔符
- C ++如何在使用"tolower"时将char转换为int
- 使用 char* 存储数据和产生的错误
- 如何使用多次 memcpy 转换回 std::vector<unsigned char>?
- 使用动态分配将 char* 复制到另一个字符**
- 在 constexpr 构造函数 (c++17) 中赋值到 const char * 在使用 Android NDK 时
- <char> 使用 Vulkan 映射内存时如何使用 std::vector 而不是 void**?
- char a[0] 使用 itoa() 将整数转换为字符串的目的
- <char> 使用 int 值初始化向量
- 是否可以让 std::vector<char> 使用选定的内存对齐方式分配内存
- 错误:<char>使用 getline 时basic_istream为非标量类型 cxx11::string
- <char> 使用字符串文本初始化向量
- 警告:'void checkGlError(const char*)'使用但从未定义
- 如何让 char[] 使用 std::map