重载另一个成员中的成员

overloading a member inside another member

本文关键字:成员 重载 另一个      更新时间:2023-10-16

在我的学校作业中,我需要一个小帮助

我的头文件:

#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[]