Ir ao conteúdo
  • Cadastre-se
Cambalinho

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

Recommended Posts

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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

posso criar 1 variavel que possa receber 1 funçao(neste caso é o endereço da funçao)\lambda que receba ou nao parametros?

Compartilhar este post


Link para o post
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.

  • Curtir 1

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×