c++ primer学习 1.5.2 初识成员函数

1.5.2例题

将两个Sales_item对象相加的程序首先检查是否有相同的ISBN.

#include "Sales_item.h"
#include <iostream>


int main()
{
	Sales_item item1,item2;
	std::cin >> item1 >> item2;
	if (item1.isbn() == item2.isbn()//检查item1和item2是否相同
	{
		std::cout << item1 + item2 << std::endl;
		return 0;//表示成功
	}
	else
	{
		std::cerr << "date must refer to same ISBN" << std::endl;
		return -1;//表示失败
	}
}
出现错误

E0980:在没有适当operator的情况下调用类类型的对象或将函数转换到指向函数的类型

C2064: 项不会计算为接受 0 个参数的函数

问题原因:在一个继承Sales-item基类的类中定义成员变量xxx,而这个基类中存在同名的函数名,导致无法调用此函数。(Sales_item程序其实没看,但每次用到都会有问题,找个时间仔细看看)

我的解决方法比较粗暴,直接恒等但是治标不治本,问题待解决。

if (item1.isbn == item2.isbn)//检查item1和item2是否相同
	

item1.isbn()==item2.isbn()

调用名为isbn的成员函数。成员函数被定义为类的一部分函数,有时也被称为方法。item.isbn 使用点运算符(.)来表示我们需要“名为item1的对象的isbn成员”,点运算符只能用于类类型的对象。其左侧必须是一个类类型的对象,右侧运算对象必须是该类型的一个成员名,运算结果为右侧运算对象指定的成员。

当用点运算符访问一个成员函数时,通常我们是想调用该函数,我们使用调用运算符(())来调用一个函数,调用运算符是一对圆括号,里面放置实参列表(可能为空),成员函数isbn并不接受参数,因此item1.isbn()调用名为item1的成员函数isbn,此函数返回item1中保存的ISBN书号。


练习1.23

编写程序,读取多条销售记录,并统计每个ISBN(每本书)有几条销售记录。

答:可以联系1.4.4 if 的例题进行编译

#include "Sales_item.h"
#include <iostream>
int main()
{
	Sales_item trans1, trans2;
	if (std::cin >> trans1)	
	{
		while (std::cin >> trans2)
		{
			if (trans1.isbn == trans2.isbn)
			{
				std::cout<<trans1+trans2<<std::endl;
			}
			else
			{
				std::cout << "ISBN不同" << std::endl;
				trans1 = trans2;
			}
			std::cout << "重新输入";
    	}	
	}
	return 0;
}

 解释不多,计数杂乱。修改

#include "Sales_item.h"
#include <iostream>
int main()
{
	Sales_item trans1, trans2;
	int num = 1;
	std::cout << "请输入若干条销售记录: " << std::endl;
	if (std::cin >> trans1)
	{
		while (std::cin >> trans2)
		{
			if (trans1.isbn == trans2.isbn)
			{
				num++;
				std::cout << trans1 + trans2 << std::endl;
			}
			else
			{
				std::cout << "ISBN不同" << std::endl;
				std::cout << trans1.isbn << "共有" << num << "条销售记录" << std::endl;
				trans1 = trans2;//记住新值
				num = 1;//重置计数器
			}
			std::cout << trans1.isbn << "共有" << num
            << "条销售记录" << std::endl;//输出相同销售记录的和
		}
	}
	    else
	    {
		std::cout << "没有数据" << std::endl;
		return -1;
	    }
	
	return 0;
}

只能统计出排列有序的情况,乱序排列重新计数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值