重载另一个成员中的成员
overloading a member inside another member
在我的学校作业中,我需要一个小帮助
我的头文件:
#include <iostream>
#include <cstring>
using namespace std;
#include "ISBNPrefix.h"
class ISBN
{
char str[11];
char area[6];
char publisher[8];
char title[7];
bool registered;
public:
ISBN();
ISBN(const char*,ISBNPrefix &);
void toStr(char*)const;
void toStrWithStyle(char*)const;
bool empty()const;
bool isRegistered() const;
bool read(istream& is, const ISBNPrefix& list);
void display(ostream&) const;
};
int isValid(const char* str);
这是我的文件的实现:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <iomanip>
using namespace std;
#include "ISBN.h"
ISBN::ISBN()
{
str[0]=' ';
area[0]=' ';
publisher[0]=' ';
title[0]=' ';
registered=false;
}
ISBN::ISBN(const char* s,ISBNPrefix& p)
{
if(isValid(s)==1)
{
strcpy_s(str,s);
}
else
{
*this=ISBN();
}
}
bool ISBN::empty()const
{
bool chk=false;
if(str[0]==' ')
chk=true;
return chk;
}
void ISBN::toStrWithStyle(char* s) const
{
if(registered)
{
sprintf(s,"%s-%s-%s-%c",area,publisher,title,str[9]);
}
else
{
toStr(s);
}
}
void ISBN::toStr(char* s) const
{
if (str[0]!=' ')
strcpy(s,str);
else
strcpy(s,"no data");
}
void ISBN::display(ostream & os) const
{
char str[14];
toStrWithStyle(str);
cout<< setw (13) <<str;
}
int isValid(const char* str)
{
int rc=0;
if(str!=0)
{
int sum,i=0;
sum=0;
for(i=0;i<10;i++)
sum+=(str[i]-'0')*(10-i);
if(sum%11==0)
{
rc= 1;
}
}
else
rc=0;
return rc;
}
bool ISBN::read(istream& is, const ISBNPrefix& list)
{
char str[11];
bool quit=false;
bool ok=false;
char lists;
do{
cout<<"ISBN (0 to quit) : ";
is.getline(str,11); //or is.get(str,11)
if(strcmp(str,"0")==0)
quit=true;
else if (isValid(str)==1)
{
*this=ISBN(str,list);
ok=true;
cout<<"isbn is valid"<<endl;
}
else
{
*this=ISBN();
cout<<"invalid ISBN"<<endl;
}
} while(!quit&&!ok);
return !quit;
}
ISBN::read
中的我在这里输入
*this=ISBN(str,list);
我想重载另一个成员,但是我不能。有人能告诉我怎么做吗?
首先,我建议使用std::string代替char[]。这会省去很多麻烦。对于阅读ISBN,我会这样写:
bool ISBN::read(istream& is)
{
ISBN result;
// reading into result
std::swap(*this,result);
return !quit;
}
或者更好(作为非成员函数):
std::istream& operator>>(istream& is, ISBN& obj)
{
ISBN result;
// reading into result
is(!quit)
is.clear(std::ios_base::failbit);
std::swap(obj,result);
return is;
}
无论如何,您应该为您的资源使用RAII类。在您的特殊情况下,std::string
而不是char[]
相关文章:
- 将重载的成员函数传递给函数模板
- 在运算符重载定义中使用成员函数(const错误)
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 解决模板成员函数重载
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- 如何为非常量和常量重载实现一次成员函数?
- 为什么重载运算符<<打印特征类成员会导致段错误?
- 运算符重载作为成员函数
- 指向重载静态成员的函数指针 - 在unique_ptr中用作自定义删除器
- 将基类的成员函数重载到其他派生类C++
- 重载具有 2 个相同数据类型成员的构造函数
- 关于在成员重载中使用 std::move() 的问题
- 成员函数不能为集合迭代器和const_iterator的输入重载(但可以为其他 STL 迭代器重载)
- 如何正确返回带有成员变量的重载运算符++?
- 在设计方面:重载vector类型的类成员的插入运算符
- 派生类不能用另一个基类的成员重载基类中的私有成员
- 用于测量重载运算符和成员函数的时间的函数
- C++基于模板成员的存在进行成员重载
- 用于类成员重载方法的 SFINAE