2013-09-01 103 views
0

main.cpp中:未定義參考類函數

#include <iostream> 
#include "pokemonList.h" 
void pokemonLookup(); 

int main() { 
    pokemonLookup(); 
    return 0; 
} 

void pokemonLookup() { 
    pokemonList pL; 
    std::cout<<std::endl<<"What Pokemon do you want to look up? "; 
    std::string pokemonLookup; 
    std::cin>>pokemonLookup; 
    pL.displayPokemon(pokemonLookup); 
} 

pokemonList.h:

#ifndef POKEMONLIST_H 
#define POKEMONLIST_H 
#include <iostream> 

class pokemonList 
{ 
    private: 
     struct pokemonTemplate { 
      std::string pokemonName; 
      std::string pokemonMoves[3]; 
      int pokemonLevel; 
      int baseATK; 
      int baseDEF; 
      int baseSPATK; 
      int baseSPDEF; 
      int baseSPEED; 
      }; 
     pokemonTemplate bulbasaur; 
     pokemonTemplate pikachu; 
    public: 
     void displayPokemon(std::string pokemon); 
    protected: 
}; 

#endif // POKEMONLIST_H 

pokemonList.cpp:

#include "pokemonList.h" 
/* 
pokemonTemplate* bulbasaur() { 
    bulbasaur.pokemonName = "Bulbasaur"; 
    bulbasaur.pokemonMoves[3]; 
    bulbasaur.pokemonLevel = 5; 
    bulbasaur.baseATK = 10; 
    bulbasaur.baseDEF = 10; 
    bulbasaur.baseSPATK = 10; 
    bulbasaur.baseSPDEF = 10; 
    bulbasaur.baseSPEED = 10; 
} 

pokemonTemplate* pikachu() { 
    pikachu.pokemonName = "Pikachu"; 
    pikachu.pokemonMoves[3]; 
    pikachu.pokemonLevel = 5; 
    pikachu.baseATK = 8; 
    pikachu.baseDEF = 10; 
    pikachu.baseSPATK = 12; 
    pikachu.baseSPDEF = 6; 
    pikachu.baseSPEED = 15; 
} 
*/ 
void displayPokemon(std::string pokemon) { 
    std::cout<<std::endl<<"Looking up: " + pokemon<<std::endl; 
} 

我意識到在pokemonList.cpp文件我有一堆壞代碼註釋掉了,這不是這個問題的含義。當我嘗試編譯,我在main.cpp中得到一個錯誤說:

D:/CodeBlocks/Projects/RelearningCPlusPlus/main.cpp:15: undefined reference to `pokemonList::displayPokemon(std::string)' 
+0

將'void displayPokemon(std :: string pokemon)'改爲'void pokemonList:displayPokemon(std :: string pokemon)'並重試。 – WhozCraig

+0

我可以建議你在地圖上存儲你的小精靈數據:'std :: map '這對於按名稱查找小精靈非常方便。 –

回答

6

你定義的函數displayPokemon(),但它沒有被定義爲一個成員函數。將其定義爲類定義之外的成員函數,你需要提及的類名:

void pokemonList::displayPokemon(std::string pokemon) { 
    std::cout<<std::endl<<"Looking up: " + pokemon<<std::endl; 
} 
+0

Typo:'pokemonList:displayPokemon' - >'pokemonList :: displayPokemon'(':' - >'::') –

1

您需要更改此設置:

void displayPokemon(std::string pokemon) { 

這樣:

void pokemonList::displayPokemon(std::string pokemon) { 
2

它應該是

void pokemonList::displayPokemon(std::string pokemon){.... 
0

Dietmar的答案解決了這個問題。

但我想補充說的是,在這種情況下,最好通過引用來傳遞參數,而不是通過值std::string pokemon傳遞參數,從而減少開銷。所以displayPokemon功能應該是:

void pokemonList:displayPokemon(std::string &pokemon) const { 
    std::cout<<std::endl<<"Looking up: " + pokemon<<std::endl; 
}; 

另外,請記住更改相應的成員函數聲明。

0

displayPokemon函數聲明爲pokemonList成員函數,但從未定義。

此:

void displayPokemon(std::string pokemon) { 
    std::cout<<std::endl<<"Looking up: " + pokemon<<std::endl; 
} 

是一些其他函數(具有相同名稱)的定義,其是不是一個pokemonList類的成員函數。要告訴編譯器,這是你必須pokemonList::

void pokemonList::displayPokemon(std::string pokemon) { 
    std::cout<<std::endl<<"Looking up: " + pokemon<<std::endl; 
} 

或者preceed其名稱的類pokemonList成員函數,你可以定義displayPokemonpokemonList類:

class pokemonList 
{ 
    private: 
     struct pokemonTemplate { 
      std::string pokemonName; 
      std::string pokemonMoves[3]; 
      int pokemonLevel; 
      int baseATK; 
      int baseDEF; 
      int baseSPATK; 
      int baseSPDEF; 
      int baseSPEED; 
      }; 
     pokemonTemplate bulbasaur; 
     pokemonTemplate pikachu; 
    public: 
     void displayPokemon(std::string pokemon) { 
      std::cout<<std::endl<<"Looking up: " + pokemon<<std::endl; 
     } 
    protected: 
}; 

不同的是,在過去的case displayPokemon將是一個內聯函數。