我是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;
}
答案 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);
。现在,编译器可以将此调用与带有许多参数的构造函数匹配。
目前的第三个问题是pokemonName
到pokemonSpeed
的所有定义都是在全局范围内的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;
};