C ++ L'oggetto Loop "accoppia" con uno in comune

-2

Non riuscivo a pensare a un nome migliore.

Ho una classe chiamata MoveObjects che contiene informazioni sulla posizione e sullo spostamento.

Allora ho due classi, Items e Attacks . Entrambi hanno MoveObjects in comune.

Quello che sto cercando di fare è il loop degli oggetti di spostamento e il ciclo determina se è associato a Item o Attack .

Fondamentalmente (ma non può farlo in questo modo)

// Classes, boiled down, looks like:

  MoveObjects {
    int x;
    int y;
  };

  Items {
    string name;
    int buff;
    int cost;
    int img_id;
  };

  Attack {
    int owner;
    int strength;
    int speed;
  };


// Polymorphism boiled down

  class Item : public MoveObjects

  class Attack : public MoveObjects


// pseudo loop

  for (int i = 0; i < MoveObjects.size; i++) {

    // if item

    // if attack

  }
    
posta Evan Carslake 15.07.2016 - 22:45
fonte

1 risposta

2

(Sto scrivendo questo come una risposta poiché è troppo lungo per un commento)

Ecco un esempio di layout per l'utilizzo di metodi virtuali per risolvere il tuo problema:

class MoveObjects {
public:
    virtual void doSomething() = 0; // declare a method name
    // other members of MoveObjects
};

class Item : public MoveObjects {
public:
    virtual void doSomething() {
        // insert Item-specific code here
    }
    // other Item members
};

class Attack : public MoveObjects {
public:
    virtual void doSomething() {
        // insert Attack-specific code here
    }
};

Fondamentalmente, dichiari un metodo in MoveObjects chiamato doSomething() e specifica che verrà implementato nelle classi derivate (in questo caso Item e Attack ).

Nel ciclo for (supponendo che moveObjects sia di tipo std::vector<MoveObjects*> o simile) chiami solo doSomething() sulla classe base, che poi reindirizza all'implementazione effettiva del metodo doSomething() del tipo corrispondente ( Item::doSomething() per oggetti di tipo Item , Attack::doSomething() per oggetti di tipo Attack ):

for(int i = 0; i < moveObjects.size(); i++) {
    moveObjects[i]->doSomething();
}
    
risposta data 16.07.2016 - 03:31
fonte

Leggi altre domande sui tag