接受不同参数的构造函数遇到麻烦

时间:2018-07-05 16:50:34

标签: c++ class oop object constructor

我是C ++的新手,我在处理类和头文件时遇到了麻烦。我正在尝试创建一个构造函数以接受各种神奇宝贝统计信息,例如字符串和整数。我以前用Java编写代码,构造函数的分配非常简单。

Pokemons.h

onbeforeunload

Pokemons.cpp

    #ifndef POKEMONS_H
    #define POKEMONS_H
    #include <string>
    #include <iostream>

    using namespace std;

    class Pokemons {
    public:
    Pokemons();

    };
    #endif /* POKEMONS_H */

main.cpp

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

    using namespace std;


        string pokemonName;
        string pokemonType1;
        string pokemonType2;
        int pokemonHP;
        int pokemonAttack;
        int pokemonDefence;
        int pokemonSPAttack;
        int pokemonSPDefence;
        int pokemonSpeed;

        Pokemons::Pokemons(string nm, string tp1, string tp2, int hp, int atk, 
        int def, int satk, int sdef, int spd) {

            pokemonName      = nm;
            pokemonType1     = tp1;
            pokemonType2     = tp2;
            pokemonHP        = hp;
            pokemonAttack    = atk;
            pokemonDefence   = def;
            pokemonSPAttack  = satk;
            pokemonSPDefence = sdef;
            pokemonSpeed     = spd;
        }

我遇到以下错误:

    #include <iostream>
    #include "Pokemons.h"

    int main(){

        Pokemons p001;
        p001.Pokemons("Bulbasaur", "Grass", "None", 31,23,45,43,45,12);
        return 0;

    }

1 个答案:

答案 0 :(得分:3)

这里有三个问题。首先,您的构造函数被声明为Pokemons();,接受零个参数,但是您有一个构造函数定义为接受了许多参数,因此它们的签名不匹配,最终,由于C ++中的函数重载,它们引用了不同的函数。尝试在头文件中声明构造函数,如下所示:

class Pokemons {
    public:
    Pokemons(string nm, string tp1, string tp2, int hp, int atk, 
        int def, int satk, int sdef, int spd);
};

现在,定义和声明都应引用同一函数。

第二个问题在这里:

Pokemons p001;

隐式调用不带参数的构造函数。重要的是要理解,即使没有显式命名许多函数,也要用C ++来调用。要解决此问题,您应按以下步骤初始化p001

Pokemons p001("Bulbasaur", "Grass", "None", 31,23,45,43,45,12);

您还应该在下一行删除p001.Pokemons("Bulbasaur", "Grass", "None", 31,23,45,43,45,12);。现在,编译器可以将此调用与带有许多参数的构造函数匹配。

目前的第三个问题是pokemonNamepokemonSpeed的所有定义都是在全局范围内的Pokemons类的外部中进行的。这与在Java中成为成员static具有类似的效果。这些应该放在您的类定义中,以使其成为实例成员:

class Pokemons {
    public:
    Pokemons(string nm, string tp1, string tp2, int hp, int atk, 
        int def, int satk, int sdef, int spd);

    private:

    string pokemonName;
    string pokemonType1;
    string pokemonType2;
    int pokemonHP;
    int pokemonAttack;
    int pokemonDefence;
    int pokemonSPAttack;
    int pokemonSPDefence;
    int pokemonSpeed;
};