класс — перегруженный оператор C ++ []

Я сделал приложение, в котором вы вводите количество книг, которое вы хотите ввести, и используете перегруженный оператор ([]), но каждый раз, когда я даю указатель для хранения массива, он выдает мне такие ошибки, как

2 IntelliSense: выражение должно иметь целое или незавершенное перечисление
Тип строки: 11 Колонка: 24 Библиотеки

а также

Ошибка 1 ошибка C2440: «инициализация»: невозможно преобразовать из
‘std :: string’ to ‘unsigned int’ Строка: 11 Колонка: 1 Библиотечная книга

но в любом случае вот мой код:

#include <iostream>
#include <string>
using namespace std;

class Books{
private:
string* storage;
string book;
public:
Books(){
storage = new string[book];
}
void savebooks(int iterate){
for (int i = 0; i < iterate; ++i){
cout << "Book: ";
getline(cin, storage[i]);
}
}

const string operator[](const int ref){
return storage[ref];
}
~Books(){
delete storage;
}
};

int main(){
//local variables
int quantity;
//user display
cout << "Welcome to Book Storage Viewer" << endl;
cout << "How many books would you like to insert: ";
cin >> quantity;
//instantiante
Books bk;
//other handle
bk.savebooks(quantity);
//display books
cout << "These are the books you've entered" << endl;
for(int i = 0; i < quantity; ++i){
cout << bk[i] << endl;
}
system("pause");
return 0;
}

Также я не уверен на 100%, правильно ли я закодировал это, и если есть больше ошибок, пожалуйста, скажите мне и спасибо.

0

Решение

Это утверждение

    storage = new string[book];

является недействительным. Значение индекса должно иметь целочисленный или неразмеченный тип перечисления.

Кажется, у вашего определения класса есть опечатка и вместо

string book;

должно быть например

int book;

Я думаю, что вы имели в виду следующее

private:
string* storage;
int quantity;
public:
Books( int quantity) : quantity( quantity ) {
storage = new string[this->quantity];
}
void savebooks(){
for (int i = 0; i < quantity; ++i){
cout << "Book: ";
getline(cin, storage[i]);
}
}
//...

И в основном там должно быть

int quantity;
//user display
cout << "Welcome to Book Storage Viewer" << endl;
cout << "How many books would you like to insert: ";
cin >> quantity;
//instantiante
Books bk();
bk.savebooks();
2

Другие решения

Мои предложения:

  1. Там нет ничего в Books чтобы указать, сколько книг. Возможно, вы хотите передать количество книг в конструкторе «Книги».

    Books(int numBooks) {
    storage = new string[numBooks];
    }
  2. Если вы хотите сохранить количество книг в Books, добавить члена. Там нет смысла для члена books, Возможно, вы намеревались использовать books хранить количество книг. Если вы решили сделать это, измените string books; в int books; и убедитесь, что вы инициализируете books в конструкторе.

    Books(int numBooks) : books(numBooks) {
    storage = new string[numBooks];
    }
  3. Если вы решили сохранить количество книг в качестве члена Booksнет необходимости проходить quantity в savebooks(), savebooks() может быть реализовано как:

    void savebooks(){
    for (int i = 0; i < books; ++i){
    cout << "Book: ";
    getline(cin, storage[i]);
    }
    }
1

кажется, никто не упоминает ошибку сегмента в конце программы
который из-за delete storage но это должно быть delete [] storage

Я попытался скомпилировать код, и это нормально, когда книги меньше 100.

   #include <iostream>
#include <string>
using namespace std;

class Books{
private:
string* storage;
string book;
public:
Books(){
storage = new string[100];
}
void savebooks(int iterate){
for (int i = 0; i < iterate; ++i){
cout << "Book: ";
getline(cin, storage[i]);
}
}

const string& operator[](const int ref){
return storage[ref];
}
~Books(){
delete [] storage;
}
};

int main(){
//local variables
int quantity;
//user display
cout << "Welcome to Book Storage Viewer" << endl;
cout << "How many books would you like to insert: ";
cin >> quantity;
//instantiante
Books bk;
//other handle
bk.savebooks(quantity);
//display books
cout << "These are the books you've entered" << endl;
for(int i = 0; i < quantity; ++i){
cout << bk[i] << endl;
}
return 0;
}
1

Что это? Разве компилятор не указывает, где ошибка?

Books(){
storage = new string[book];
}
0
По вопросам рекламы [email protected]