繁体   English   中英

未定义对类中函数的引用

[英]Undefined reference to function in class

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)'

您定义了函数displayPokemon()但未将其定义为成员函数。 要将其定义为类定义之外的成员函数,您需要提及类名:

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

它应该是

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

您需要更改此:

void displayPokemon(std::string pokemon) {

对此:

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

Dietmar的答案解决了这个问题。

但是我想补充一点,在这种情况下,最好是通过引用传递参数,而不是通过std::string pokemon传递值,从而减少开销。 因此displayPokemon函数应为:

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

另外,请记住更改相应的成员函数声明。

displayPokemon函数被声明为pokemonList成员函数,但从未定义。

这个:

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

是不是pokemonList类成员函数的其他函数(具有相同名称)的定义。 要告诉编译器这是一个pokemonList类成员函数,您必须在其名称前加上pokemonList::

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

另外,您可以在pokemonList类中定义displayPokemon

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

区别在于,在最后一种情况下, displayPokemon将是内联函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM