2015-03-07 2 views
-8

EDIT: Вам необходимо сделать такой же вектор:Использование функции члена класса в векторе

vector myVector (5);

не нравится:

вектор myVector [5];

+1

Что такое точное сообщение об ошибке, и (угадывания) вы компилировать main.cpp, а также команды .cpp? – Wintermute

+0

Основная проблема заключается в том, что вы создаете массив векторов, а не один вектор. Вам также нужно вызвать 'string' по имени' std :: string' в 'team.h'. – juanchopanza

ответ

2

Вместо vector<team> players[5];vector<team> players(5); должно быть. С помощью этой операции вы создадите вектор из 5 игроков. В вашем коде создаются 5 пустых векторов.

0

На самом деле вы должны получить гораздо больше ошибок. Я получаю следующее:

cl /nologo /EHsc /Za /W4 stackoverflow.cpp 
stackoverflow.cpp 
stackoverflow.cpp(5) : error C2146: syntax error : missing ';' before identifier 'name' 
stackoverflow.cpp(5) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
stackoverflow.cpp(9) : error C2061: syntax error : identifier 'string' 
stackoverflow.cpp(10) : error C2146: syntax error : missing ';' before identifier 'getName' 
stackoverflow.cpp(10) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
stackoverflow.cpp(10) : warning C4183: 'getName': missing return type; assumed to be a member function returning 'int' 
stackoverflow.cpp(22) : error C2511: 'void team::setName(std::string)' : overloaded member function not found in 'team' 
     stackoverflow.cpp(3) : see declaration of 'team' 
stackoverflow.cpp(23) : error C2065: 'name' : undeclared identifier 
stackoverflow.cpp(23) : error C2065: 'b' : undeclared identifier 
stackoverflow.cpp(30) : error C2556: 'std::string team::getName(void)' : overloaded function differs only by return type from 'int team::getName(void 
     stackoverflow.cpp(10) : see declaration of 'team::getName' 
stackoverflow.cpp(30) : error C2371: 'team::getName' : redefinition; different basic types 
     stackoverflow.cpp(10) : see declaration of 'team::getName' 
stackoverflow.cpp(31) : error C2065: 'name' : undeclared identifier 
stackoverflow.cpp(42) : error C2039: 'setRuns' : is not a member of 'std::vector<team,std::allocator<_Ty>>' 
     with 
     [ 
      _Ty=team 
     ] 
stackoverflow.cpp(43) : error C2039: 'setName' : is not a member of 'std::vector<team,std::allocator<_Ty>>' 
     with 
     [ 
      _Ty=team 
     ] 
stackoverflow.cpp(45) : error C2039: 'getName' : is not a member of 'std::vector<team,std::allocator<_Ty>>' 
     with 
     [ 
      _Ty=team 
     ] 
stackoverflow.cpp(45) : error C2039: 'getRuns' : is not a member of 'std::vector<team,std::allocator<_Ty>>' 
     with 
     [ 
      _Ty=team 
     ] 

имена классов стандартной библиотеки C++ начинаются с std::. Это просто часть их имени. Хорошая практика - всегда использовать полное имя. В частности, очень плохой практикой является использование using namespace std; в глобальной области видимости в файле заголовка.

Итак, давайте удалим using namespace std и напишем std:: всюду.

team.h:

#include<string> 

class team { 

    std::string name; 
    int runs; 

public: 
    void setName(std::string a); 
    std::string getName(); 
    void setRuns(int b); 
    int getRuns(); 
}; 

team.cpp:

#include<string> 
#include "team.h" 

void team::setRuns(int b) { 
    runs=b; 
} 

void team::setName(std::string a) { 
    name=b; 
} 

int team::getRuns() { 
    return runs; 
} 

std::string team::getName() { 
    return name; 
} 

main.cpp:

#include<iostream> 
#include<vector> 
#include<cstdio> 
#include "team.h" 

int main() { 
    std::vector<team> players[5]; 
    players[0].setRuns(10); 
    players[0].setName("Michael"); 

    printf("%s %d",players[0].getName(),players[0].getRuns()); 
    system("pause"); 
    return 0; 
} 

Это устраняет большинство ошибок:

stackoverflow.cpp(22) : error C2065: 'b' : undeclared identifier 
stackoverflow.cpp(39) : error C2039: 'setRuns' : is not a member of 'std::vector<team,std::allocator<_Ty>>' 
     with 
     [ 
      _Ty=team 
     ] 
stackoverflow.cpp(40) : error C2039: 'setName' : is not a member of 'std::vector<team,std::allocator<_Ty>>' 
     with 
     [ 
      _Ty=team 
     ] 
stackoverflow.cpp(42) : error C2039: 'getName' : is not a member of 'std::vector<team,std::allocator<_Ty>>' 
     with 
     [ 
      _Ty=team 
     ] 
stackoverflow.cpp(42) : error C2039: 'getRuns' : is not a member of 'std::vector<team,std::allocator<_Ty>>' 
     with 
     [ 
      _Ty=team 
     ] 

a в setRuns, безусловно, опечатка. Мы также исправим это. Я также просто удалю ненужный system("pause");. Теперь у нас есть код, который показывает только ошибка, о которой вы просили.

Давайте повнимательнее посмотрим на следующую строку:

std::vector<team> players[5] 

Я думаю, что недоразумение в том, что [5] определяет размер std::vector. Это заблуждение. A std::vector не имеет фиксированного размера и будет начинаться с 0 элементов по умолчанию. Для инициализации не требуется никакого синтаксиса []. Синтаксис [] обозначает массив . Массив представляет собой набор элементов фиксированного размера.

Итак, вы создали здесь массив из 5 векторов. Видимо, это совсем не то, что вы хотели. Просто замените [5] с (5), чтобы получить значение «вектора, который начинается с 5 элементов»:

std::vector<team> players(5); 

Теперь он собирает.Но это, вероятно, аварии во время выполнения, потому что вы также можете использовать printf неправильно:

printf("%s %d",players[0].getName(),players[0].getRuns()); 

printf является функцией C, которая была разработана задолго до появления C++. %s означает, что ожидается строка C-стиля. Вы могли обеспечить один такой:

printf("%s %d",players[0].getName().c_str(),players[0].getRuns()); 

Или вы просто использовать C++ потоки:

std::cout << players[0].getName() << " " << players[0].getRuns(); 
Смежные вопросы