2016-04-04 12 views
1

Bir ödev için basit durum makinesini programlamaya çalışıyorum. Ödev, giriş için bir dize verildiğinde, “Kedi” durumunda başlayıp bilgi tükenene kadar eylemler gerçekleştiren bir kod oluşturmaktır. Yapı türünün bir nesnesini bir if… else deyimine nasıl düzgün bir şekilde yerleştiririm?

İşte yapmak ne çalışıyorum betimlediği bir grafik verilmiştir:

chart


Şimdi, neredeyse kodu bitirdim ama bir işlev içinde bir problem var. Hata alıyorum "geçersiz işlenenler ikili ifadeye ('Devlet' ve 'Devlet')" Birisi bana bu sorunun nasıl düzeltileceğine dair bir ipucu verebilir ve neyin yanlış olduğuyla ilgili kısa bir açıklama yapabilir mi? Sorun, bir if..else ifadesindeki yapı türlerini kullanmaktır.

I) (int ana önce bu kod bölümünü vardır:

struct State{ 
    string A, B; 
}; 

State Cat = {"Meow", "Ignore"}; 
State Noise = {"Boing", "Thud"}; 
State Food = {"Lemons", "Cinnamon"}; 

State mystate = Cat; 

//my_state.A -> string 

Ve burada fonksiyon hatası olduğu:

void change_state(char c) { 
    // on taking character c, it changes current state 
    // If state is Cat and I get 1 , change to Food 
    // If state is Cat and I get 2 , change to Noise 
    // If state is Food and I get 1 , change to Noise 
    // If state is Food and I get 2 , change to Cat 
    // If state is Noise and I get 1 , change to Cat 
    // If state is Noise and I get 2 , change to Food 

    if (mystate == Cat){ //error 
    if (c == '1') { 
     mystate = Food; 
    } 
    else { 
     mystate = Noise; 
    } 
    } 
    else if (mystate == Food) { 
    if (c == '1') { 
     mystate = Noise; 
    } 
    else { 
     mystate = Cat; 
    } 
    } 
    else { 
    if (c == '1') { 
     mystate = Cat; 
    } 
    else { 
     mystate = Food; 
    } 
    } 
} 

Herhangi bir yardım takdir edilecektir!

cevap

2

Özel türleri == ile karşılaştırmak için, bu tür iki nesnenin eşit kabul edildiğini belirtmek üzere, tür için operator=='u aşırı yüklemeniz gerekir. Örneğin

: İki State s tarihinde == kullandığınızda Şimdi, bu işlev çağrılır

bool operator==(State const& left, State const& right) { 
    return left.A == right.A && left.B == right.B; 
} 

.

diğer bilgiler: Operator overloading

+0

'std :: bağı (left.A, left.B) == std :: bağlantı (right.A, right.B) 'açık olabilir . Eğer hiçbir şey işlenenler –

+0

sebepten dolayı büyürse [KISS] tercih ederim (https://en.wikipedia.org/wiki/KISS_principle). – emlai

+0

Bana daha basit görünüyor. –

2

@zenith belirttiği gibi, ne için soruyorsunuz operatör aşırı yüklenmesini kullanarak yapılabilir. Ancak, bir struct durum değeri olarak kullanmak gerçekten anlamlı değildir. tarafından sağlanan solüsyon yanında, sana yapı için

State(cosnt string& a, const string &b):A(a), B(b){} 

İkinci bir kurucusu tanımlamak düşünüyorum

enum State {Cat, Noise, Food}; 
string StateStrings[3][2]; 

... 

StateStrings[Cat][0] = "Meow"; 
StateStrings[Cat][1] = "Ignore"; 

StateStrings[Noise][0] = "Boing"; 
StateStrings[Noise][1] = "Thud"; 

StateStrings[Food][0] = "Lemons"; 
StateStrings[Food][1] = "Cinnamon"; 

State mystate = Cat; 

... 

void change_state(char c) 
{ 
    // on taking character c, it changes current state 
    // If state is Cat and I get 1 , change to Food 
    // If state is Cat and I get 2 , change to Noise 
    // If state is Food and I get 1 , change to Noise 
    // If state is Food and I get 2 , change to Cat 
    // If state is Noise and I get 1 , change to Cat 
    // If state is Noise and I get 2 , change to Food 

    switch (mystate) 
    { 
    case Cat: { 
     switch (c) { 
     case '1': mystate = Food; break; 
     case '2': mystate = Noise; break; 
     } 
     break; 
    } 
    case Noise: { 
     switch (c) { 
     case '1': mystate = Cat; break; 
     case '2': mystate = Food; break; 
     } 
     break; 
    } 
    case Food: { 
     switch (c) { 
     case '1': mystate = Noise; break; 
     case '2': mystate = Cat; break; 
     } 
     break; 
    } 
    } 
} 
0

İlk: Daha zaten senin akış şemasına satır içi olan yerine enum kullanabilirsiniz doruk, bunun yerine bir üye işlev operator== tanımlayabiliriz:
bool State::operator==(State const& right) { return this->A == right.A && this->B == right.B; }

İlgili konular