c++ передать карту по ссылке в функцию
как я могу пройти map
by reference
в функцию? Visual Studio 2010 дает мне unresolved externals
ошибка. В настоящее время у меня есть следующий упрощенный код:
void function1(){
map<int, int> * my_map = new map<int, int>();
function2(*my_map);
}
void function2(map<int, int> &temp_map){
//do stuff with the map
}
здесь есть несколько ответов на подобные вопросы, но они используют typedef
и добавить std::
к началу определения, но я действительно не уверен, почему.
int ComputerPlayer::getBestMoves(){
//will return the pit number of the best possible move.
//map to hold pit numbers and rankings for each possible pit number.
//map<pitNumber, rank> only adds pit numbers to map if they have seeds in them.
std::map<int, int> possiblePits; //map
std::map<int, int>::iterator it; //iterator for map
for(int index = 1; index <= getBoardSize(); index++){
if(_board.getPitValue(index) > 0){
possiblePits.insert( pair<int, int>(index, 0) );
}
}
int tempBoardSize = _board.getBoardSize();
//loop that will analyze all possible pits in the map
for(it = possiblePits.begin(); it != possiblePits.end(); it++){
Board tempBoard = _board;
int pitNum = it->first;
int score = analyzePlay(pitNum, tempBoard, possiblePits);
}
return 0;
}
int analyzePlay(int pitNum, Board tempBoard, std::map<int, int> &possibleMoves){
int tempBoardSize = tempBoard.getBoardSize();
int tempSeeds = tempBoard.getPitValue(pitNum);
int lastPitSown;
tempBoard.setPitToZero(pitNum);
for(int index = 1; index <= tempSeeds; index++){
if(pitNum == tempBoardSize * 2 + 1){
//skips over human's score pit
pitNum += 2;
lastPitSown = pitNum;
tempBoard.incrementPit(pitNum);
}
else{
pitNum++;
lastPitSown = pitNum;
tempBoard.incrementPit(pitNum);
}
}
if(tempBoard.getPitValue(lastPitSown) == 1 && lastPitSown >= tempBoardSize + 2 && lastPitSown <= tempBoardSize * 2 + 1){
//turn ends. last seed sown into empty pit on opponent side.
}
else if(tempBoard.getPitValue(lastPitSown) > 1 && lastPitSown != tempBoardSize + 1){
//keep playing with next pit. last seed was sown into non-empty pit.
}
else if(lastPitSown == tempBoardSize + 1){
//extra turn. last seed sown into score pit.
}
else if(tempBoard.getPitValue(lastPitSown) == 1 && lastPitSown != tempBoardSize + 1 && lastPitSown <= tempBoardSize && lastPitSown >= 1 ){
//turn ends. last seed sown into empty pit on your side. capture.
}
return 0;
}
ошибка, которую я получал:
Error 1 error LNK2019: unresolved external symbol "public: int __thiscall ComputerPlayer::analyzePlay(int,class Board,class std::map<int,int,struct std::less<int>,class std::allocator<struct std::pair<int const ,int> > > &)" (?analyzePlay@ComputerPlayer@@QAEHHVBoard@@AAV?$map@HHU?$less@H@std@@V?$allocator@U?$pair@$$CBHH@std@@@2@@std@@@Z) referenced in function "public: int __thiscallComputerPlayer::getBestMoves(void)" (?getBestMoves@ComputerPlayer@@QAEHXZ) C:UsersJoshDropboxCongkak_2Congkak_2ComputerPlayer.obj
Error 2 error LNK1120: 1 unresolved externals C:UsersJoshDropboxCongkak_2DebugCongkak_2.exe
1 ответов
две вещи:
- добавить
#include<map>
вверху, и использоватьstd::map
вместоmap
. - определение
function2
вышеfunction1
или по крайней мере объявитьfunction2
вышеfunction1
.
вот как это должно быть сделано:
#include<map>
void function2(std::map<int, int> &temp_map); //forward declaration
void function1(){
std::map<int, int> my_map; //automatic variable
//no need to make it pointer!
function2(my_map);
}
void function2(std::map<int, int> &temp_map){
//do stuff with the map
}
также обратите внимание, что избегайте new
как можно больше. Использовать автоматическое переменные по умолчанию, если у вас нет очень веских причин не использовать его.
автоматические переменные быстро, и код выглядит аккуратным и чистым. С их помощью проще писать код безопасности исключений.
EDIT:
теперь, когда вы опубликовали ошибку, вы также поняли, что,
Я забыл добавить класс, частью которого была функция, в начало. как в: Player:: function2 (std::map
&temp_map){}
, как вы сказали в комментарии.
хорошо, что ты сам догадался. Но все же, всегда post ошибка в самом первом посте, когда вы задаете вопрос. Помнить об этом.