重载另一个成员内的成员

时间:2013-06-17 04:58:05

标签: c++

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

这是我的头文件:

#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]='\0';
    area[0]='\0';
    publisher[0]='\0';
    title[0]='\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]=='\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]!='\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);

我想让另一名成员超负荷,但我不能。 任何人都可以告诉我,我该怎么做?

1 个答案:

答案 0 :(得分:2)

首先我建议使用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[]