2017-04-13 1 views
1

J'ai deux instances d'un robot de classe. Quand je cours une certaine méthode (par exemple, go()) je veux chaque instance à aller si c'est sur une fréquence correcte. Exemple (pour simplifier tout est dans un fichier):Comment invoquer une méthode sur plusieurs instances en C++

class Robot { 
    int freqency_from; 
    int freqency_to; 
    bool is_going = false; 

    bool isOnFrequency(int frequency) { 
     return (frequency >= frequency_from && frequency <= frequency_to); 
    } 

public: 
    Robot(int _freqency_from , int _freqency_to) { 
     freqency_from = _freqency_from; 
     freqency_to = _freqency_to; 
    } 

    void go(int frequency) { 
     if (isOnFrequency(frequency)) { 
      is_going = true; 
     } 
    } 

    bool isGoing() { 
     return is_going; 
    } 
}; 

int main() { 
    Robot robot1 = Robot(1, 3); 
    Robot robot2 = Robot(3, 5); 

    cout << robot1.isGoing(); // false 
    cout << robot2.isGoing(); // false 

    Robot::go(1); // should be run for each and every instance of the Robot class 

    cout << robot1.isGoing(); // true 
    cout << robot2.isGoing(); // false 

    return 0; 
} 

Comment faire fonctionner ce pseudo-code? Est-il même possible sans faire un vecteur de toutes les instances de Robot et de cartographier dessus?

+1

Vous pourriez probablement avoir un vecteur membre statique de pointeurs vers des instances existantes et rendre la méthode 'go' statique également. Mais je ne pense pas que ce soit un bon design. – Corristo

+2

Ceci se dirige vers statique/territoire "singleton" et ressemble à une odeur de code pour moi. Dans ce cas, s'il y a quelque chose que Robot devrait faire, alors vous devriez avoir une sorte de RobotManager qui en garde une collection pour faire diverses tâches. Cette logique métier ne doit pas être dans la classe 'Robot' elle-même. – CoryKramer

+0

@CoryKramer [Je vais l'appeler .. SomethingManager] (https://blog.codinghorror.com/i-shall-call-it-somethingmanager/) –

Répondre

1

Qu'en est-il d'une ancienne boucle régulière? Rangez simplement vos robots dans un conteneur et passez dessus.

vector<Robot> robots;  
robots.emplace_back(1, 3); 
robots.emplace_back(3, 5); 

for (auto& robot : robots) 
{ 
    cout << robot.isGoing(); 
    robot.go(1); 
    cout << robot.isGoing(); 
} 
+0

Oui, c'est ce que je vais faire. Je ne connaissais pas la méthode '.emplace_back()', cependant. Doux! :) –

+0

Désolé, je n'ai pas remarqué que vous aviez demandé explicitement quelque chose d'autre que le vecteur. 'list',' map' et 'set' vont tous fonctionner, bien sûr. Mais vous êtes coincé gérer une collection de quelque sorte. Il n'y a pas de sauce secrète pour énumérer les instances sans un. –

+0

Je n'ai absolument rien contre les vecteurs.En fait, je les aime vraiment :) Je pensais juste qu'il pourrait y avoir une méthode «globale» qui serait exécutée sur chaque instance de la classe. Mais tout cela a un sens total. Merci! :) –

1
Robot::go(1); 

doit être exécuté pour chaque instance de la classe Robot

pas vraiment, aller est pas une méthode statique ...

vous avez besoin d'un instance comme robot1 ou robot2 afin de commander ce robot,

si vous voulez d o que tous les robots réagissent à la fonction go puis déclarer envisager de définir cette méthode statique

+0

Correct, mais si je le déclare statique, il ne sera pas capable de changer/obtenir les propriétés des objets, non? –

+0

@CzajkowskiDariusz oui vous avez raison, OP devra définir bien ce qui appartient à un contenu statique et ce qui ne l'est pas –

+0

Droite, mais si je fais une propriété 'frequency' /' is_going' une propriété statique, alors elle ne pourra pas à définir dans le constructeur ...:/Je suppose que la seule option est de faire un vecteur de pointeurs sur toutes les instances et ensuite de les mapper en exécutant la méthode 'go()' sur chacune, une par une. –