c++17(17)-异常try catch,operator[],vector at

0,精通Python,62.37==>1
1,精通C++,49.21==>1
1,精通C++,49.21==>1
访问索引超过范围

Hit any key to continue...
#include <iostream>
#include <cstring> 
#include <vector>
using namespace std;

class Book
{
private:
    int _id;
    char* _name;
    float _price;
    static inline int nowid{0};
    int _bookCount{1};
public : 
    Book(int id, char* name, float price)
        : _id(id)
        , _price(price)
    {
        int nameLen = strlen(name);
        _name = new char[nameLen + 1];
        strcpy(_name, name);
    }
    Book(char* name, float price):Book(nowid,name,price){
        nowid++;
    }

    ~Book()
    {
        delete[] _name;
    }
    friend const Book& operator +(const Book& leftBook,const Book& rightBook){
        if (leftBook==rightBook) {
            Book *book=new Book(rightBook._name, rightBook._price); 
            book->_bookCount=leftBook._bookCount+rightBook._bookCount;
            return *book;
        }
        else{
            return leftBook;
        }
    }
    friend const Book& operator -(const Book& leftBook,const Book& rightBook){
        if (leftBook==rightBook) {
            Book *book=new Book(rightBook._name, rightBook._price); 
            book->_bookCount=leftBook._bookCount-rightBook._bookCount;
            if ( book->_bookCount<0) book->_bookCount=0;
            return *book;
        }
        else{
            return leftBook;
        }        
    }  

    Book& operator -=(const Book& otherBook){
        if (*this==otherBook) {
            _bookCount-=otherBook._bookCount;
            if ( _bookCount<0) _bookCount=0;
            return *this;
        }
        else{
            return *this;
        }        
    }      
    Book& operator +=(const Book& otherBook){
        if (*this==otherBook) {
            _bookCount+=otherBook._bookCount;
            return *this;
        }
        else{
            return *this;
        }        
    }    
    friend const bool operator ==(const Book& leftBook,const Book& rightBook){
        if (strcmp (rightBook._name,leftBook._name) == 0 && rightBook._price==leftBook._price) {
            return true;
        }
        else{
            return false;
        }        
    } 
    friend  const bool operator !=(const Book& leftBook,const Book& rightBook){
        if (strcmp (rightBook._name,leftBook._name) == 0 && rightBook._price==leftBook._price) {
            return false;
        }
        else{
            return true;
        }        
    }    
    const void print() const{
        cout<<_id<<","<<_name<<","<<_price<<"==>"<< _bookCount<<endl;
    }
    void printCount(){
         cout<<_name<<":"<<_price<<"==>"<< _bookCount<<endl;       
    }
};
class BookS{
private:
    vector<Book*> _myBooks;
public:
    void addBook(Book* book){
        _myBooks.push_back(book);   
    }
    void print() {
        for(const Book *bk:_myBooks){
            bk->print();
        }
    }
    Book& operator[](int i){      
         return *(_myBooks.at(i));
     }

};

int main(int argc, char **argv)
{
   Book *book1=new Book("精通Python",62.37);  
   Book *book2=new Book("精通C++",49.21);     
   BookS myBks;
   myBks.addBook(book1); 
   myBks.addBook(book2); 
   myBks.print();
   try
   {     
       myBks[1].print();
       myBks[2].print();  
   }
   catch(std::out_of_range e){
       cout<<"访问索引超过范围"<<endl;
   }
    
}

下面对[]的重载,对vector使用.at的方式访问,这样可以抛出超范围异常,如果直接使用[]将导致超过范围

Book& operator[](int i){      
     return *(_myBooks.at(i));
 }
发布了385 篇原创文章 · 获赞 13 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/AI_LX/article/details/104495236