Ir para conteúdo
Fórum Script Brasil
  • 0

padrão de projeto State em C++


rodrigobastos

Pergunta

alguém saberia alguma documentaçao sobre padrão State?

Fiz este codigo mas obtenho erro na linha Machine::off, Machine::on

#include <iostream>

using namespace std;

class Machine
{
  class State *current;
  public:
    Machine();
    void setCurrent(State *s)
    {
        current = s;
    }
    void on();
    void off();
};

class State
{
  public:
    virtual void on(Machine *m)
    {
        cout << "   already ON\n";
    }
    virtual void off(Machine *m)
    {
        cout << "   already OFF\n";
    }
};

void Machine::on()
{
  current->on(this);
}

void Machine::off()
{
  current->off(this);
}

class ON: public State
{
  public:
    ON()
    {
        cout << "   ON-ctor ";
    };
    ~ON()
    {
        cout << "   dtor-ON\n";
    };
    void off(Machine *m);
};

class OFF: public State
{
  public:
    OFF()
    {
        cout << "   OFF-ctor ";
    };
    ~OFF()
    {
        cout << "   dtor-OFF\n";
    };
    void on(Machine *m)
    {
        cout << "   going from OFF to ON";
        m->setCurrent(new ON());
        delete this;
    }
};

void ON::off(Machine *m)
{
  cout << "   going from ON to OFF";
  m->setCurrent(new OFF());
  delete this;
}

Machine::Machine()
{
  current = new OFF();
  cout << '\n';
}

int main()
{
  void(Machine:: *ptrs[])() = 
  {
    Machine::off, Machine::on
  };
  Machine fsm;
  int num;
  while (1)
  {
    cout << "Enter 0/1: ";
    cin >> num;
    (fsm.*ptrs[num])();
  }
  system("pause");
}

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

não entendi muito bem mais acho que você quer fazer uma herança de classe certo ?? coloque na frente da classe que quer fazer herança assim olha

exemplo: class nome : tipo nomedaclasseprincipal

exemplo: class primeiro : public segunda

deixo um exemplo aqui

#include <iostream>

using namespace std;

class Primeira
{
    private:
            int x;
    public:
            void define_x(int);
            int acessa_x();
};

class Segundo:public Primeira
{
    public:
           void exibe(Primeira *p);
};

void Primeira::define_x(int x)
{
 this->x = x;
}

int Primeira::acessa_x()
{
 return x;
}

void Segundo::exibe(Primeira *p)
{
    printf("X: %d", p->acessa_x());
}

int main()
{
    Primeira primeira;
    Segundo segundo;

    primeira.define_x(10);
    segundo.exibe(&primeira);

    cin.get();
    return 0;
}

usei o codeblock (c:B) para compilar

acho que e isso falou ^^

@edit

so uma coisa que esqueçi de falar (escrever) :rolleyes: o Primeira *p e a chamada e necessario caso queria acessar o conteudo dentro dela caso tire isso apareçera uma variavel enorme qualquer que não refere-se nada ao que usamos (definimos em primeira.define_x(10); ) vlw denovo xD

tambem notei um pequeno erro em seu codigo me fale o que você quer fazer com isso ?

void Machine::on()

{

current->on(this);

}

void Machine::off()

{

current->off(this);

}

Editado por ce1o2e
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...