Ir ao conteúdo
  • Cadastre-se

C++ - declaraçao de funçoes numa class


Cambalinho

Posts recomendados

ve este codigo:

class b
{
public:
virtual void tests(){};
b()
{
tests();
}
};

class c: public b
{
}c;

se 'c' é directivo de 'b' e a class é considerada public, porque tenho de declarar as funçoes virtuais de novo na class 'c'?

honestamente queria saber se existe outra forma sem as ter que declarar de novo

Link para o comentário
Compartilhar em outros sites

#include <iostream>

class B
{
public:
virtual void tests(){};
};

class C : public B
{
};



int main()
{
C c;
c.tests();

getchar();
}

sem declarar na classe C

pois mas assim nao posso alterar a funçao tests(), por isso é que meti 1 variavel antes do ';'. mas se essa é a unica forma.. obrigado por tudo

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...

eis o codigo para fazer eventos:

#ifndef events_H_INCLUDED
#define events_H_INCLUDED

#include <functional>
#include <vector>


template <class ... b>
class events
{
public:
typedef std::function<void(b...argx )> OnSomethingHandler;

events(OnSomethingHandler Handler)
{
handlers_=Handler;
}

void operator() (b&&... args)
{
handlers_ (std::forward<b> (args)...);
}

events& operator = (OnSomethingHandler Handler)
{
handlers_ = Handler;
return *this;
}

private:
OnSomethingHandler handlers_;

};

#endif // events_H_INCLUDED

esta muit fixe ;)

eis como o uso:

#include <iostream>
#include <string>
#include "events.h"

using namespace std;

class test
{
public:
events<> Printed{[](){;}};
void write(string a)
{
cout << a;
Printed();
}

};

test a;


int main()
{
a.Printed=[]()
{
cout<<"\nMessage Printed\n";
};
a.write("hello world");
cin.get();
return 0;
}

esta sem erros... muito fixe, mas preciso de fazer 1 alteraçao para poder alterar o valor do Printed fora da funçao main.

para isso o membro da funçao tem de ser 'static'. mas ao lhe fornecer o valor eu tenho de usar o nome da class e nao o nome do objecto. alguem me pode ajudar neste problema?

(nem posso subrescrever(overloading) o operador '::')

alguem que me de 1 boa noticia para poder alterar o valor do Printed fora do main.

Link para o comentário
Compartilhar em outros sites

#include <iostream>
#include <string>
#include <functional>
#include <vector>

using namespace std;

template <class ... b>
class events
{
public:
typedef std::function<void(b...argx)> OnSomethingHandler;

events(OnSomethingHandler Handler)
{
handlers_ = Handler;
}

void operator() (b&&... args)
{
handlers_(std::forward<b>(args)...);
}

events& operator = (OnSomethingHandler Handler)
{
handlers_ = Handler;
return *this;
}

private:
OnSomethingHandler handlers_;

};

class test
{
public:
events<> Printed{ [](){; } };
void write(string a)
{
cout << a;
Printed();
}

};

test a;

int main()
{
auto msg = "\nOutra Msg\n";
a.Printed = [&]()
{
cout << msg;
};
a.write("hello world");
cin.get();
return 0;
}

colocando um & dentro dos [] você pode pegar todas as variaveis que estejam dentro do escopo por referencia, se colocar [=] vai pegar todos por valor.

Link para o comentário
Compartilhar em outros sites

#include <iostream>
#include <string>
#include <functional>
#include <vector>

using namespace std;

template <class ... b>
class events
{
public:
typedef std::function<void(b...argx)> OnSomethingHandler;

events(OnSomethingHandler Handler)
{
handlers_ = Handler;
}

void operator() (b&&... args)
{
handlers_(std::forward<b>(args)...);
}

events& operator = (OnSomethingHandler Handler)
{
handlers_ = Handler;
return *this;
}

private:
OnSomethingHandler handlers_;

};

class test
{
public:
events<> Printed{ [](){; } };
void write(string a)
{
cout << a;
Printed();
}

};

test a;

int main()
{
auto msg = "\nOutra Msg\n";
a.Printed = [&]()
{
cout << msg;
};
a.write("hello world");
cin.get();
return 0;
}

colocando um & dentro dos [] você pode pegar todas as variaveis que estejam dentro do escopo por referencia, se colocar [=] vai pegar todos por valor.

muito obrigado pela informaçao. mas eu quero re-fazer a class, sem usar o templates. por isso perguntei se posso fazer 1 variavel para receber 1 funcçao\lambda com ou sem parametros

Link para o comentário
Compartilhar em outros sites

No .net Framework os eventos recebem 2 parametros, um object (o objeto que lançou o evento) e um EventArgs (os argumentos do evento), sendo que cada evento tem uma implementação propria do EventArgs, pois cada evento terá seus proprios parametros. Exemplo:

a classe Console tem o evento CancelKeyPress que detecta quando você aperta (ctrl + C) ou (ctrl + Break), isso faz o programa encerrar, porém no evento tem o segundo parametro que é ConsoleCancelEventArgs que possui 2 propriedades, uma bool Cancel e outra SpecialKey, se você não quiser encerrar o programa, pode trocar o valor da variavel Cancel para true, e o programa não encerrara, e SpecialKey diz se foi com (ctrl + C) ou (ctrl + Break) que o evento foi chamado.

Link para o comentário
Compartilhar em outros sites

No .net Framework os eventos recebem 2 parametros, um object (o objeto que lançou o evento) e um EventArgs (os argumentos do evento), sendo que cada evento tem uma implementação propria do EventArgs, pois cada evento terá seus proprios parametros. Exemplo:

a classe Console tem o evento CancelKeyPress que detecta quando você aperta (ctrl + C) ou (ctrl + Break), isso faz o programa encerrar, porém no evento tem o segundo parametro que é ConsoleCancelEventArgs que possui 2 propriedades, uma bool Cancel e outra SpecialKey, se você não quiser encerrar o programa, pode trocar o valor da variavel Cancel para true, e o programa não encerrara, e SpecialKey diz se foi com (ctrl + C) ou (ctrl + Break) que o evento foi chamado.

desculpa, mas nao entendi o porque que dissestes isso :(

eu preciso de criar 1 variavel que recebe 1 funçao:

typedef std::function <void (...) someevent;

ou

 void (*foo)(...)

nao entendo como a vou usar no construtor e no operador '=' :(

porque '(...)' esta-me a dar erros :(

class event
{
private:

void (*foo)(...);
public:
event(void (*foo1)(...))
{
foo=foo1;
}
void operator()(...)
{
foo();
};
event& operator()(void (*foo1)(...))
{
foo=foo1;
return *this;
};

event& operator = (void (*foo1)(...))
{
foo=foo1;
return *this;
};
};

por favor me ve esta class e ve se detectas algume erro

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...