error: expected initializer before '.' token

171
30 октября 2018, 08:20

Пытаюсь написать простенькую фонотеку, где класс содержит название и исполнителя трека.Пользователь должен ввести эти данные сам. Компилятору почему-то не нравятся строки "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;
}
Answer 1

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

Кстати, при этом конструктор по умолчанию не нужен.

READ ALSO
Аналог getch() на чистом c++ или с использованием WIN API

Аналог getch() на чистом c++ или с использованием WIN API

недавно написал консольные крестики-нолики и сделал управление в игре через передачу данный с помощью cinХотелось бы как-то упустить этап...

402
Зачем нужны функциональные интерфейсы?

Зачем нужны функциональные интерфейсы?

В чем их преимущество? Где их используют? Чем они отличаются от 'просто' интерфейса с одним методом? Есть примеры использования функциональных...

205
Может ли стать причиной утечки памяти объявление SharedPreferences и SQLiteDatabase статическими?

Может ли стать причиной утечки памяти объявление SharedPreferences и SQLiteDatabase статическими?

Я обычно в небольших приложениях объявляю SharedPreferences статическим, и SQLiteDatabase статическим, может ли это стать причиной утечки памяти? Или мне...

145