Пытаюсь написать простенькую фонотеку, где класс содержит название и исполнителя трека.Пользователь должен ввести эти данные сам. Компилятору почему-то не нравятся строки "std::string another.title (UsersChoice);" и "std:: string another.performer(UsersChoice);". Пишет: error: expected initializer before '.' token.Считает, что созданный в main экземпляр класса Track неинициализирован? Вот код.
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Track{
public:
string title;
string performer;
Track (string trackTitle, string trackPerformer)
{
title=trackTitle;
performer =trackPerformer;
};
};
int main()
{
char More = 'y';
vector <Track> vectorData;
string UsersChoice;
Track another ();
while (More== 'y')
{
cout << "Do you want to insert another track? Y/N"<< endl;
cin >> More;
if (More== 'y')
{
cout << "Insert the title of the track "<< endl;
getline (cin, UsersChoice);
std::string another.title (UsersChoice);
cout << "Insert the performer "<< endl;
getline (cin, UsersChoice);
std:: string another.performer(UsersChoice);
vectorData.push_back (another());
}
else break;
}
return 0;
}
Track another();
- это объявление функции, возвращающей Track
.
std::string another.title (UsersChoice);
- это попытка очередного объявления - но чего? another.title
- это не новая переменная...
vectorData.push_back(another());
- тут вы пытаетесь вызывать функциию/функциональный объект another
. Который таковым не является.
Если исправить все это и добавить конструктор по умолчанию
Track() = default;
то все получится:
class Track{
public:
string title;
string performer;
Track() = default;
Track (string trackTitle, string trackPerformer)
{
title=trackTitle;
performer =trackPerformer;
};
};
int main()
{
char More = 'y';
vector <Track> vectorData;
string UsersChoice;
Track another;
while (More== 'y')
{
cout << "Do you want to insert another track? Y/N"<< endl;
cin >> More;
if (More== 'y')
{
cout << "Insert the title of the track "<< endl;
getline (cin, UsersChoice);
another.title = UsersChoice;
cout << "Insert the performer "<< endl;
getline (cin, UsersChoice);
another.performer = UsersChoice;
vectorData.push_back(another);
}
else break;
}
return 0;
}
Получится в смысле компиляции, но не работы: вы обнаружите, что после чтения cin>>More
в буфере остается перевод строки, не дающий вам правильно вводить очередную строку...
Словом, я бы делал так:
int main()
{
vector <Track> vectorData;
for(char More = 'y'; More == 'y';
cout << "Do you want to insert another track? Y/N: ",
cin >> More, cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n'))
{
std::string input1, input2;
cout << "Insert the title of the track: " << endl;
getline(cin, input1);
cout << "Insert the performer: ";
getline(cin, input2);
vectorData.emplace_back(input1, input2);
}
return 0;
}
Кстати, при этом конструктор по умолчанию не нужен.
Виртуальный выделенный сервер (VDS) становится отличным выбором
недавно написал консольные крестики-нолики и сделал управление в игре через передачу данный с помощью cinХотелось бы как-то упустить этап...
В чем их преимущество? Где их используют? Чем они отличаются от 'просто' интерфейса с одним методом? Есть примеры использования функциональных...
Я обычно в небольших приложениях объявляю SharedPreferences статическим, и SQLiteDatabase статическим, может ли это стать причиной утечки памяти? Или мне...