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