2016-12-09 1 views
0

Arduino와 함께 작업을 시작했으며 지연 명령을 사용하지 않도록 시간 공유 시스템을 만들고 싶습니다.Arduino의 종속성 주입

다른 개체를 상속하는 개체를 등록하려고 할 때 문제가 있습니다. "와우 와우 Miuau의 miuau ..."

내가 인터페이스를 만들려고 어떻게 내가 레지스터를 선언 할 때 나는 의심이() 함수 : 여기

나는 터미널에 표시해야 테스트 코드를 Cat 및 Dog 객체를 Animal 유형 Array에 입력 할 수 있습니다. 내 영어에 대한

어떤 도움을 환영합니다
class Animal { 
    public: 
    void message() { 

    } 
}; 

class Dog : public Animal { 
    public: 
    void message() { 
    Serial.println("Guau guau"); 
    } 
}; 

class Cat : public Animal { 
    public: 
    void message() { 
    Serial.println("Miau miau "); 
    } 
}; 

class Multiplex { 
    private: 
    int index = 0; 
    Animal objects[5]; 
    public: 

    void register(Animal object) { 
    objects[index] = object; 
    index++; 
    } 

    void go() { 
    for(int i = 0;i<index;i++) { 
     objects[i].message(); 
    } 
    } 

}; 

Dog dog; 
Cat cat; 
Multiplex multiplex; 

void setup() { 
    // put your setup code here, to run once: 
    Serial.begin(9600); 
    multiplex.register(dog); 
    multiplex.register(cat); 

} 

void loop() { 
    // put your main code here, to run repeatedly: 
    multiplex.go(); 
    delay(1000); 

} 

...

감사합니다 죄송합니다 :

다음 코드는 문제를 보여주기 위해 단지이다.

답변

1

이 경우에는 다형성 (가상 메소드)을 사용해야합니다. 그러나 여전히 많은 수의 "등록 된"개체가 Animal 기본 클래스에 적용되지 않습니다 (Animal::message()이 호출되기 때문에 아무 것도 표시되지 않습니다). 당신은 포인터 사용 (또는 참조 -하지만이 경우에는 그리 쉬운) 동적 다형성을 좋아하지 않는 경우에, 당신은 올바른 형식으로 개체 유형, 스위치 타입 캐스팅 같은 것을 사용해야

class Animal { // pure virtual class (abstract class) 
    public: 
    virtual void message() = 0; // The '= 0;' makes whole class "pure virtual" 
}; 

class Dog : public Animal { 
    public: 
    virtual void message() { 
    Serial.println("Guau guau"); 
    } 
}; 

class Cat : public Animal { 
    public: 
    virtual void message() { 
    Serial.println("Miau miau "); 
    } 
}; 

class Multiplex { 
    private: 
    int index = 0; 
    Animal * objects[5]; 
    public: 

    void reg(Animal * object) { // pass pointer to the object 
    objects[index] = object; // object must be valid for whole time 
    index++; 
    } 

    void go() { 
    for(int i = 0;i<index;i++) { 
     objects[i]->message(); 
    } 
    } 

}; 

Dog dog; 
Cat cat; 
Multiplex multiplex; 

void setup() { 
    // put your setup code here, to run once: 
    Serial.begin(9600); 
    multiplex.reg(&dog); 
    multiplex.reg(&cat); 

} 

void loop() { 
    // put your main code here, to run repeatedly: 
    multiplex.go(); 
    delay(1000); 
} 

.

+0

내가 찾고있는 것. 잘 지내라. 감사!!! – hazardco