2017-04-13 2 views
1

두 개의 로봇 클래스 인스턴스가 있습니다. 나는 몇 가지 방법 (예를 들어, 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); 

이 ... 정적 메서드가 아닌 각각의 실행

정말이, 이동 로봇 클래스의 모든 인스턴스해야

당신은 필요 그 로봇을 명령하기 위해 robot1 또는 robot2 같은 인스턴스

당신은 D 원한다면 ㅇ 모든 로봇은 은 무엇 정기적 된 루프에 대한 정적 메소드

+0

수정,하지만 난 그것을 정적 선언하는 경우, 변경할 수 없습니다/객체의 속성을 가져, 아니 : 당신이 원하는 경우를 보라 : 꽤 좋은 같은데? –

+0

@CzajkowskiDariusz 예이다 권리, 영업 이익은 물론 어떤 정적 콘텐츠에 속하고 어떤 –

+0

오른쪽 나던을 정의해야합니다,하지만 난'frequency'가 /'is_going' 재산 정적 일을 할 경우, 그것은 할 수 없습니다 // 생성자에서 설정 될 유일한 옵션은 모든 인스턴스에 대한 포인터 벡터를 만들고 각각에 대해'go()'메소드를 실행하여 매핑하는 것입니다. –