Проблема с созданием массива объектов в моем проекте: ожидаемый безусловный идентификатор - PullRequest
0 голосов
/ 25 ноября 2018

Цель этого (заведомо неполного) проекта - просто попрактиковаться с объектами в свободное время.Я столкнулся со следующей ошибкой при тестировании проекта, и я не уверен точно, в чем может быть проблема.

"ожидаемый неквалифицированный идентификатор перед '[' токен Competitor [] listOfCompetitors = new Competitor [10]; "

Любая помощь очень ценится.

main.cpp

#include <iostream>
#include <string>
#include competitor.cpp;

using namespace std;
int scoringMethod;
int numberOfCompetitors;

int main(int argc, char** argv){
cout<<"How would tou like to score the competition? (please enter an interger)"<<endl;
cout<< "1. Closest Total Points"<<endl<<"2. Closest Total Points Without Going Over" <<endl<<"3. Closest to team1 Score"<<endl<< "4. Closest to Opponent Score"<<endl<<endl;
cin>>scoringMethod;
cout<<endl<<"How many competitors do you have?"<<endl;
cin>>numberOfCompetitors;
Competitor[] listOfCompetitors = new Competitor[10];
string tempName;
int tempScore1, tempScore2;
for (int i = 0; i<numberOfCompetitors;i++){

    cout<<"Name of competitor number "<< i<<"?"<<endl;
    cin>>tempName;
    cout<<tempName<<"'s prediction for team1's score?"<<endl;
    cin>>tempScore1;
    cout<<tempName<<"'s prediction for the score of team1's opponent?"<<endl;
    cin>>tempScore2;

    listOfCompetitors[i] = new Competitor(tempName,tempScore1,tempScore2);
}    
cout <<endl<<"The program has reached the end successfully" << endl;
}

competitor.cpp

#include <iostream>
#include <string>

using namespace std;

class Competitor{
private:
string Name;
int team1Score;
int opponentScore;

public:
Competitor(){
    Name = "invalid";
    team1Score = opponentScore = 0;
}
Competitor(string nameIn, int inteam1Score, int inOpponentScore){
    Name=nameIn;
    team1Score=inteam1Score;
    opponentScore=inOpponentScore;
}
void printData(){
    cout<<this->Name<<"'s guess:"<<endl<<"team1: "<<team1Score<< "     Opponent: "<<opponentScore<<endl;
}
};

1 Ответ

0 голосов
/ 25 ноября 2018
Competitor[] listOfCompetitors = new Competitor[10];

Это синтаксически неверно (по крайней мере для C / C ++) и является причиной, по которой вы получаете ошибку.Если вы хотите динамически выделить массив Competitors, вы можете сделать

Competitor *listOfCompetitors = new Competitor[10];

, и это будет динамически выделять массив 10 Competitors.


Пара другихпроблемы с вашим кодом:

  1. Вы выполняете цикл с {0 ... numberOfCompetitors} и получаете доступ к массиву listOfCompetitors на каждом ходу.Что если numberOfCompetitors ≥ 10?Доступ к listOfCompetitors[i] для i ≥ 10 становится UB, или неопределенное поведение .

  2. Следующая строка приведет к утечке памяти, если она вообще скомпилируется.

    listOfCompetitors [i] = новый конкурент (tempName, tempScore1, tempScore2);

Тип listOfCompetitors[i] равен Competitor, но new Competitor(...) вернет aтип Competitor* (указатель на Competitor).Таким образом, new здесь не является необходимым.Этого должно быть достаточно:

listOfCompetitors[i] = Competitor(tempName, tempScore1, tempScore2);
Вы не удаляете динамически выделенную память.Каждый раз, когда вы используете new, вы должны помнить, чтобы использовать delete, иначе произойдет утечка памяти.(Есть определенные исключения из этого, но не в большинстве C ++.) Вам нужно освободить listOfCompetitors.

Так что после того, как вы закончили использовать listOfCompetitors (после цикла for, возможно), сделайте

delete []listOfCompetitors;
#include competitor.cpp; это не должно компилироваться ?.Используйте кавычки вокруг имен файлов нестандартных библиотек, которые вы включаете: #include "competitor.cpp".

Как предлагается в комментариях, вы можете использовать std::vector или std::array STL контейнеры.С ними легче работать, когда речь идет о динамических массивах, и все управление памятью для вас.(Также, поскольку вы пометили свой вопрос с помощью C ++ 11 containers, контейнеры STL были бы отличным местом для работы.)

Я настоятельно рекомендую взять книгу C ++, чтобы прочитать и /или взять онлайн-учебники, чтобы закрепить основы динамически выделяемой памяти, массивов и прочего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...