简体   繁体   中英

List of items, in c++

http://ideone.com/UlHrxS

I made a list of items and i don't know what i did wrong. Please correct me and post the link from ideone. I tried to make a list of game objects in a array but it doesn't work. Thanks.

#include <iostream>
#include <stdlib.h>

using namespace std;

class item{
private:
public:
    item(){
        //constructor
    }
    int id;
};

class sword:public item{
private:
public:
    int damage;
    string type = "Sword";
};

class potion:public item{
private:
public:
    int PlusHealth;
    string type = "Potion";
};

class shield:public item{
private:
public:
    int armor;
    string type = "Shield";
};

int main()
{
    item *v[10];

    bool run = true;
    int aux;
    int i = 0;
    while(run == true && i<10) {
        cout << "1- Sword 2-Shield 3-Potion  --  ";
        cin >> aux;
        switch(aux){

        case 1: v[i] = new sword;
                cout << "Sword created!\n";
                break;

        case 2: v[i] = new shield;
                cout << "Shield created!\n";
                break;

        case 3: v[i] = new potion;
                cout << "Potion created!\n";
                break;

        default: run = false;
                break;
        }
        i++;
    }

    system("cls");

    cout << "List of items: \n";
    for(int x=0;x=i-1;x++){
        cout << v[x]->type;
        if(type=="Sword"){
            cout << " Damage: " << v[x].damage;
        } else if(type=="Shield"){
            cout << " Armor: " << v[x].armor;
        } else if(type=="Potion") << v[x].PlusHealth;

    }
    return 0;
}

You are breaking some concepts here.
You have vector of pointers to parent class, item . You should only use the methods and members in the item class.

This is not proper implementation:

   for(int x=0;x=i-1;x++){
        cout << v[x]->type;
        if(type=="Sword"){
            cout << " Damage: " << v[x].damage;
        } else if(type=="Shield"){
            cout << " Armor: " << v[x].armor;
        } else if(type=="Potion") << v[x].PlusHealth;

    }

Try adding something like this:

class Item
{
  public:
    // A generic function for child classes to print
    //    their specific details.
    virtual void print_details(std::ostream& out) const = 0;
};

class Sword : public Item
{
  public:
    void print_details(std::ostream& out) const
    {
       out << "  Damage: " << damage << "\n";
    }
};

class Shield : public Item
{
  public:
    void print_details(std::ostream& out) const
    {
      out << "  Armor: " << armor << "\n";
    }
};

class Potion : public Item
{
  public:
    void print_details(std::ostream& out) const
    {
      out << "  Health: " << PlusHealth << "\n";
    }
};

//...
for (unsigned int x = 0; x < v.size(); ++x)
{
  cout << "\n"
       << v[x]->type
       << "\n";
  // Get the child to print the specifics.
  v[x]->print_details(cout);
}

The key point is that you can only access item methods and members directly . You can create item methods, that the child classes will need to implement, for specialized behavior . In the above case, printing specific details.

The item base class contains common methods and members for each child. Keep the concept generic and remember that container of item s should be treated generically.

Thanks!, but if i want to access set and get functions of derived classes from the base class ? How i can do that generically? because i have different attributes on every item

Example: v[1].setPlusHealth it works because v[1] is a potion but v[1].setArmor it doesn't work because isn't a armor. How i can do that ?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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