0

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

这是我的头文件:

#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);

我想超载另一个成员,但我不能。谁能告诉我我该怎么做?

4

1 回答 1

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

于 2013-06-17T05:59:11.427 回答