2017-04-13 66 views
1

我有一個類Robot的兩個實例。當我運行的一些方法(比如,go())我希望每一個實例如果是在一個正確的頻率。示例(爲了簡單起見,所有內容都在一個文件中):如何在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; 
} 

如何使此僞代碼有效?如果沒有製作Robot的所有實例的矢量並映射它,甚至有可能嗎?

+1

你可能會有一個指向現有實例的靜態成員向量,並使'go'方法也是靜態的。但我不認爲這是一個好設計。 – Corristo

+2

這是走向靜態/「單身」的領土,似乎對我來說是一種代碼味道。在這種情況下,如果每個「機器人」都應該做的事情,那麼你應該有一種'RobotManager',它可以讓它們集合起來完成各種任務。該商業邏輯不應該在「Robot」類中。 – CoryKramer

+0

@CoryKramer [我要給它.. SomethingManager(https://blog.codinghorror.com/i-shall-call-it-somethingmanager/) –

回答

1

?只需將您的機器人存放在一個容器中並重復執行即可。

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

是的,這就是我要做的。雖然沒有意識到'.emplace_back()'方法。甜! :) –

+0

對不起,我沒有注意到你明確要求除矢量以外的東西。當然,'list','map'和'set'都可以工作。但是你被困在管理某種類型的集合中。沒有一個枚舉實例並不是祕密。 –

+0

我完全沒有反對向量。我其實真的很喜歡他們:)我只是覺得可能會有一些'全局'方法會在每個類的實例上運行。但所有這些都是完全合理的。謝謝! :) –

1
Robot::go(1); 

應該運行每Robot類

不是真的,去的每一個實例是不是一個靜態的方法...

您需要例如像以吩咐機器人robot1或robot2,

,如果你想d但願所有的機器人應對旅途中的功能,然後再申報考慮 定義怎麼樣一個普通的舊循環,方法靜態

+0

正確的,但如果我宣佈它靜態的,也不會是能夠改變/獲取對象的屬性,不是嗎? –

+0

@CzajkowskiDariusz是你是對的,OP需要定義清楚什麼屬於靜態內容,什麼犯規 –

+0

權,但如果我做一個'frequency' /'is_going'物業靜態的,那麼它將無法在構造函數中設置...:/我想唯一的選擇是創建一個指向所有實例的指針向量,然後通過對它們逐個運行'go()'方法映射它們。 –