Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使这些子类彼此交互?_C++_Class_Pointers_Reference_Polymorphism - Fatal编程技术网

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. /

我有一个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.
//

#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”)
{
退出=真;
}否则退出=错误;
}

coutMake
health
variable
protected
而不是
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,没有任何附加功能(如检查),也没有任何限制。合同本质上就是你收到的东西,就是你储存的东西。也就是说,设计本身并不是最好的(告诉,不要问)。