多种类型的数组

时间:2018-06-18 03:16:10

标签: c++ arrays class pointers

所以我现在正在做一个夏季小项目 - 一个基于文本的RPG(我知道 - 原创!)。无论如何,我遇到了一个问题。我希望我的角色有一个库存类,其中包含指向不同项目的指针数组。问题是这些物品本身会有许多不同的类型(武器,任务,混合等)。所以我想知道是否有一种方法可以制作一个可以在不同类型之间切换的指针?或者我的想法完全错了?谢谢。 - 西蒙病房

4 个答案:

答案 0 :(得分:2)

我知道您可以使用Object Oriented Programming作为Kenny Castrodon brightcfillion的3个答案来解决您的问题。但是,void pointer也是一种解决方案。我知道这不是一个好主意,但它也可以解决你的问题,我想为你介绍它。我的演示代码如下:

#include<iostream>
using namespace std;
//assume you just have 3 item type
class A
{
public:
    void func(){
       cout<<"I am A object\n";
    }
};

class B
{
public:
     void func(){
        cout<<"I am B object\n";
     }
};

class C
{
public:
     void func(){
        cout<<"I am C object\n";
     }
};

int main()
{
  //assume that you have 5 items of three types
  void* items[5];
  char type[5];  //if items[i] is A object then type[i] = 'A'
                 //if items[i] is B object then type[i] = 'B'
                 //if items[i] is C object then type[i] = 'C'
   //When you insert item into array, let's mark 'A', 'B', or 'C' for each item
   items[0]=new A, type[0]='A';
   items[1]=new B, type[1]='B';
   items[2]=new C; type[2]='C';
   items[3]=new B, type[3]='B';
   items[4]=new A, type[4]='A';

   for(int i=0;i<5;i++) 
   {
     if(type[i]=='A'){
        ((A*)items[i])->func();
     }
     if(type[i]=='B'){
        ((B*)items[i])->func();
     }
     if(type[i]=='C'){
        ((C*)items[i])->func();
     }
   }
   return 0;
}

<强>输出

I am A object I am B object I am C object I am B object I am A object

答案 1 :(得分:1)

如果您的所有项目类都继承自共同的祖先(例如Item类),您将能够拥有Item *的向量。这也是使用多态的好时机:

#include <iostream>
#include <vector>

class Item {
public:
  virtual const char *name() const = 0;
  virtual void use() = 0;
};

class Knife : public Item {
public:
  const char *name() const override { return "Knife"; }
  void use() override { std::cout << "Using the knife" << std::endl; }
};

class Laser : public Item {
public:
  const char *name() const override { return "Laser"; }
  void use() override { std::cout << "Using the laser" << std::endl; }
};

int main() {
  std::vector<std::unique_ptr<Item>> v;
  v.emplace_back(std::make_unique<Knife>());
  v.emplace_back(std::make_unique<Laser>());

  for(const std::unique_ptr<Item> &i : v) {
    std::cout << "Name: " << i->name() << std::endl;
    i->use();
  }

  return 0;
}

输出:

$ c++ --std=c++14 m.cpp
Name: Knife
Using the knife
Name: Laser
Using the laser

答案 2 :(得分:1)

继承应该适用于此。你所要做的就是创建一个基类(父类),例如一个类型(它应该是什么类型的类 - 武器,任务,混合)。每个itemType类都将从这个父类继承,当你存储所有这些项时,你将它们与objectType一起存储为父类,然后当你读取一个项时,你看它的类型,把它转换为适当的类键入然后用它做你需要的东西。

class parentItem
{
public:
    parentItem(string) : type(string) {};
    string type; //Doesn't have to be a string, could be an enum or anything you want
}

class weapon : public parentItem
{
    weapon() : parentItem("Weapon"){};
    weaponInfo wInfo;
    int damageDeals;
}

当您从广告资源中访问其中一个

时,代码中的其他位置
parentItem item = player.getWeapon() // Just generic code, just grabbing the object
Weapon* sword;
if(parentItem.type = "Weapon")
{
    sword = (Weapon*)item
}
sword->attack(); //or whatever you want to do with it

TLDR: 在每个项类上使用继承,以便它们都可以被认为是1类型,然后在需要访问子类的信息时将它们转换为适当的类型

答案 3 :(得分:1)

你可以有一个classX类型的数组(或std :: vector),现在从classX派生所有可携带的项目。另见Vector that can have 3 different data types C++。这是一个非常简化的例子:

#include <string>
#include <vector>
#include <iostream>

class Carryable {
public:
    virtual std::string info()=0;
};

class Potion: public Carryable {
public:
    std::string name;
    int mana;
    std::string info() { return "potion - name["+name+\
       "] mana["+std::to_string(mana) + "]"; };
};

class Book: public Carryable {
public:
    std::string title;
    std::string author;
    std::string info() { return "book - title["+title+"] author["+author+"]"; };
};

main() {
    std::vector<Carryable*> inventory;
    Potion p;
    p.name="Dragon breath";
    p.mana=40;
    inventory.push_back( &p );
    Book b;
    b.title="Wisdom of Chu";
    b.author="Wen Chu";
    inventory.push_back( &b );
    for (int i=0;i<inventory.size();i++) {
        std::cout << "inventory item " << i << ":";
        std::cout << inventory[i]->info() << "\n";
    }
}

输出:

don@oysters:~/proj/src$ ./a.out 
inventory item 0:potion - name[Dragon breath] mana[40]
inventory item 1:book - title[Wisdom of Chu] author[Wen Chu]