C++ 如何使这些子类彼此交互?
我有一个pokemon应用程序,我想让这些pokemon“战斗”,我想让health成为一个参考变量,它位于pokemon类的private部分。我不知道如何在C++类中初始化引用变量。谢谢你花时间阅读我的帖子。我希望外面有人能帮助我C++ 如何使这些子类彼此交互?,c++,class,pointers,reference,polymorphism,C++,Class,Pointers,Reference,Polymorphism,我有一个pokemon应用程序,我想让这些pokemon“战斗”,我想让health成为一个参考变量,它位于pokemon类的private部分。我不知道如何在C++类中初始化引用变量。谢谢你花时间阅读我的帖子。我希望外面有人能帮助我 // // main.cpp // pokemon // // Created by Frank Novello on 8/25/13. // Copyright (c) 2013 Frank Novello. All rights reserved. /
//
// main.cpp
// pokemon
//
// Created by Frank Novello on 8/25/13.
// Copyright (c) 2013 Frank Novello. All rights reserved.
//
#include <iostream>
using namespace std;
//<------------------------------------------------------------------------------------>
class Pokemon
{
public:
Pokemon(){};
~Pokemon(){};
void setName(string x){name = x;};
string getName(){return name;};
void setLevel(int x){level = x;};
int getLevel(){return level;};
void setHeight(int x){height = x;};
int getHeight(){return height;};
void setWeight(int x){weight = x;};
int getWeight(){return weight;};
void setHealth(int x){health = x;};
int getHealth(){return health;};
void displayStats()
{
cout << "pokemon: " << name << endl;
cout << "\t\t\tlevel: " << level << endl;
cout << "\t\t\thp: " << health << endl;
cout << "\t\t\theight: " << height << endl;
cout << "\t\t\tweight: " << weight << endl;
}
private:
string name;
int level;
int height;
int health; //Want to make this a reference variable
float weight;
};
//<------------------------------------------------------------------------------------------------->
class ElectricPokemon: public Pokemon
{
public:
ElectricPokemon(){};
~ElectricPokemon(){};
void attack()
{
cout <<"Shocked" << endl;
}
private:
};
//<------------------------------------------------------------------------------------------------->
class WaterPokemon: public Pokemon
{
public:
WaterPokemon(){};
~WaterPokemon(){};
private:
};
//<------------------------------------------------------------------------------>
class FirePokemon: public Pokemon
{
public:
FirePokemon(){};
~FirePokemon(){};
private:
};
//<------------------------------------------------------------------------------------->
class PsycicPokemon: public Pokemon
{
public:
PsycicPokemon(){};
~PsycicPokemon(){};
private:
};
//<------------------------------------------------------------------------------->
int main(int argc, const char * argv[])
{
ElectricPokemon * pickachew = new ElectricPokemon();
WaterPokemon * squirtle = new WaterPokemon();
PsycicPokemon * kahdabra = new PsycicPokemon();
FirePokemon * charmander = new FirePokemon();
cout << "\n\t\t\t <-------------Pokedex------------->" << endl;
bool quit = false;
while (!quit) {
cout << "Slect a Pokemon to view stats: "<< "\n\t\t 1-Pickachew" << "\n\t\t 2-Squirtle" << "\n\t\t 3-Charmander" << "\n\t\t 4-Kahdabra"<< endl;
int x;
cin >> x;
switch (x) {
case 1:
pickachew -> setName("Pickachew");
pickachew -> setLevel(1);
pickachew -> setHealth(100);
pickachew -> setHeight(1);
pickachew -> setWeight(10);
pickachew -> displayStats();
break;
case 2:
squirtle -> setName("Squirtle");
squirtle -> setLevel(1);
squirtle -> setHealth(80);
squirtle -> setHeight(1);
squirtle -> setWeight(15);
squirtle -> displayStats();
break;
case 3:
charmander -> setName("Charmander");
charmander -> setLevel(1);
charmander -> setHealth(120);
charmander -> setHeight(1);
charmander -> setWeight(15);
charmander -> displayStats();
break;
case 4:
kahdabra -> setName("Kahdabra");
kahdabra -> setLevel(60);
kahdabra -> setHealth(800);
kahdabra -> setHeight(6);
kahdabra -> setWeight(150);
kahdabra -> displayStats();
break;
}
cout << "\n\n\t\t Would you like to select another Pokemon(y/n): " << endl;
string choice;
cin >> choice;
if (choice == "n")
{
quit = true;
}else quit = false;
}
cout << "Program Quiting..." << endl; return 0;
}
//
//main.cpp
//口袋妖怪
//
//由Frank Novello于2013年8月25日创作。
//版权所有(c)2013 Frank Novello。版权所有。
//
#包括
使用名称空间std;
//
类口袋妖怪
{
公众:
口袋妖怪(){};
~Pokemon(){};
void setName(字符串x){name=x;};
字符串getName(){return name;};
void setLevel(intx){level=x;};
int getLevel(){return level;};
void setHeight(intx){height=x;};
int getHeight(){返回高度;};
void setWeight(intx){weight=x;};
int getWeight(){返回权重;};
void setHealth(intx){health=x;};
int getHealth(){return health;};
void displayStats()
{
库特定重(150);
kahdabra->displayStats();
打破
}
不能选择;
如果(选项==“n”)
{
退出=真;
}否则退出=错误;
}
coutMakehealth
variableprotected
而不是private
。然后,您可以从派生代码的每一个类中访问它,在C++中,您可以使用关键字<代码>朋友< /C>来访问私有成员函数和受保护的成员函数,从另一个类或对象类型访问私有成员函数和受保护的成员函数。您需要在头文件中包含包含私有成员函数或受保护成员函数的类,例如
class A {
friend class B;
}
你也可以反过来做。因此,B类可以是a类的朋友,a类可以是B类的朋友。main
中的这四个指针是非常不必要的。如果以后确实需要多态性,请使用智能指针。不管怎么说,你到底为什么想把健康作为参考?这很容易产生事与愿违的结果,可能没有什么好的理由这么做。我将研究智能指针。我想让一个口袋妖怪的攻击影响另一个口袋妖怪的健康,所以我想我需要将健康作为一个参考变量。@FrankNovello我仍然无法理解使用健康的参考将如何帮助你(也许你可以提供一个你想做什么的例子?)。为了使对象相互作用,你可以使用一个成员函数,例如void Pokemon::attack(Pokemon&)
@FrankNovello我想你误解了什么是“引用变量”。。。它指的是什么?每个引用变量都需要引用一个实际变量。。。你是不是被指针和推荐人搞混了?或者你说的“引用变量”是完全不同的意思吗?好吧,谢谢,如果我想从squirt到pikachew运行函数攻击,我怎么能让它攻击pikachew的健康变量呢?我很想投反对票,但我只想说:这破坏了封装,这是一种糟糕的架构。而是提供(适当时受保护的)getter和setter。只是因为现在的事情很小,这不是借口,小事情有发展的趋势。。。学习也不是借口,因为你应该学习正确的设计。一个好的IDE可以减少编写访问器方法的痛苦。hyde你能帮我回答我的问题吗?protected
只允许你在成员函数中访问自己对象的基类成员@hyde事实上,有人认为,使这些类型的变量可访问不会破坏封装,因为它已经(可以说)被破坏了。OP已经提供了getter和setter,没有任何附加功能(如检查),也没有任何限制。合同本质上就是你收到的东西,就是你储存的东西。也就是说,设计本身并不是最好的(告诉,不要问)。