Ir ao conteúdo
  • Cadastre-se

alguem que me corrija por favor


Cambalinho

Posts recomendados

neste site vi codigo, mas penso ser você++: http://www.codeproject.com/Articles/155717/Handling-Enhanced-Mouse-Wheels-in-your-Application

e vejo esta linha:

BOOL CDibView::DoMouseWheel(UINT fFlags, short zDelta, CPoint point)

pela linha entendo:

TipoRetorno NomeClass::NomeFuncao(argumentos)

isto é possivel em C++?

ou só com esta sintax:

class test
{
//membros da class mas public
}test;

????

Link para o comentário
Compartilhar em outros sites

Cambalinho, estavas sumido!

Sinceramente não entendi a tua pergunta,


TipoRetorno NomeClass::NomeFuncao(argumentos)

isto é possível em C++?

Como assim é possível? se é EXATAMENTE assim que se faz em C++!


class minha_classe
{
public:
bool funcao();
}
//
//
int main()
{
minha_classe teste;
teste.minha_classe::funcao();
}

Link para o comentário
Compartilhar em outros sites

Cambalinho, estavas sumido!

Sinceramente não entendi a tua pergunta,


TipoRetorno NomeClass::NomeFuncao(argumentos)

Como assim é possível? se é EXATAMENTE assim que se faz em C++!


class minha_classe
{
public:
bool funcao();
}
//
//
int main()
{
minha_classe teste;
teste.minha_classe::funcao();
}

desculpa mas nao entendestes.. eu ando á procura de 1 cena á meses e ainda nao encontrei lol

vamos continuar com o teu codigo:


class minha_classe
{
public:
bool funcao();
}

minha_classe teste;

bool teste::funcao()
{
cout << "hello world";
}

int main()
{
teste.funçao();
}

queria fazer algo assim em C++.. ja entendi que C++ nao o permite. será que me podes ajudar para ser possivel?

Link para o comentário
Compartilhar em outros sites


class minha_classe
{
public:
bool funcao();
}

minha_classe teste;

bool teste::funcao()
{
cout << "hello world";
}

int main()
{
teste.funçao();
}

queria fazer algo assim em C++.. ja entendi que C++ nao o permite. será que me podes ajudar para ser possivel?

Ué, mas claro que permite. E sim, é possível. Você não fez nada mais do que declarar uma variável global do tipo minha_classe chamada teste. O seu único equivoco foi esquecer o comando extern. Corrigindo:


class minha_classe
{
public:
bool funcao();
}

[COLOR="Blue"]extern[/COLOR] minha_classe teste;

bool teste::funcao()
{
cout << "hello world";
}

int main()
{
teste.funçao();
}

Ela é global pelo fato de tê-la definido fora do contexto do main() ou qualquer outro.

Link para o comentário
Compartilhar em outros sites

Ué, mas claro que permite. E sim, é possível. Você não fez nada mais do que declarar uma variável global do tipo minha_classe chamada teste. O seu único equivoco foi esquecer o comando extern. Corrigindo:


class minha_classe
{
public:
bool funcao();
}

[COLOR="Blue"]extern[/COLOR] minha_classe teste;

bool teste::funcao()
{
cout << "hello world";
}

int main()
{
teste.funçao();
}

Ela é global pelo fato de tê-la definido fora do contexto do main() ou qualquer outro.

muito obrigado.

deixa-me perguntar 1 coisa: imagina que na class tenho 3 funçoes, posso só declarar\definir apenas 1 delas no objecto?

Link para o comentário
Compartilhar em outros sites

Não. Um objeto (global ou local) de uma classe pode invocar qualquer função publica da classe.

Apenas cuidado dobrado com esse tipo de objetos. Os globais. Eles são manipulados por vários clientes ao mesmo tempo a partir de vários locais. Cuidado em dobro porque o mau uso por parte de alguma outra rotina automaticamente fará as demais se comportarem mal (ou não); alem disso o momento do acesso, ou seja, quando o erro ocorreu, pode ser indeterminado o que faria o debuging uma tarefa muito difícil.

É completamente desaconselhável usa-los.

Uma dica pessoal é: se for usa-los, que não tenham funções do tipo setter, apenas as de tipo getter. Assim você impede os clientes de fazerem besteira. A classe global funciona apenas como um provedor de serviços, nada mais.

Link para o comentário
Compartilhar em outros sites

main.cpp

#include <iostream>

using namespace std;

class minha_classe
{
public:
bool funcao();
}

extern minha_classe teste;

bool teste::funcao()
{
cout << "hello world";
}

int main()
{
teste.funçao();
}

mensagens de erro:

error: stray '\347' in program

error: expected initializer before 'teste'

has not been declared

In function 'bool funcao()':

warning: no return statement in function returning non-void [-Wreturn-type]

In function 'int main()':

error: 'teste' was not declared in this scope

error: expected ';' before 'ao'

Link para o comentário
Compartilhar em outros sites

Você copiou e colou o código do fórum pro seu editor de texto, o que deve ter levado algum carácter de formatação ou algo tipo. O compilador não sabe o que é (nem você, porque é invisível) e por isso não compila (stray '\347' in program).

Apague e escreva o código a mão pra não gerar problemas.

Link para o comentário
Compartilhar em outros sites

Você copiou e colou o código do fórum pro seu editor de texto, o que deve ter levado algum carácter de formatação ou algo tipo. O compilador não sabe o que é (nem você, porque é invisível) e por isso não compila (stray '\347' in program).

Apague e escreva o código a mão pra não gerar problemas.

ja descubri o 1º erro: usei o caracter 'ç' e o compilador nao aceita ;)

(edita o teu exemplo, para os outros leitores nao acharem este erro;))

#include <iostream>

using namespace std;

class test
{
public:
void write();
};


extern test a;

void a::write()
{
cout << "oi";
}

int main()
{
a.write();
return 0;
}

mensagem de erro:

"error: 'a' is not a class, namespace, or enumeration"

o que fiz mal?

Link para o comentário
Compartilhar em outros sites

Ah bom, nesse caso retire o extern. Porque pensei que você iria usa-lo como uma interface. Se retira-lo vai funcionar.

Apenas cuidado, que há um erro de compilação nessa linha:


void [COLOR="Red"]a[/COLOR]::write()

Você se equivocou no nome da classe!

eu queria usar dessa forma como fosse polimorfismo de objectos, em vez de classes... mas da-me esses erros.

mas sim, penso que o termo correcto é polimorfismo de objectos. posso o fazer em C++?

Link para o comentário
Compartilhar em outros sites

Não percebo a duvida e nem mesmo a pergunta.

Alguma vezes eu acho que usas os termos técnicos completamente fora de contexto. O que me leva a crer que ou tu não sabe o que é, ou aprendeu uma definição equivocada. Nesse caso, o uso do termo polimorfismo, no teu post não faz nenhum sentido pra mim. Ou isso, ou somos todos vitimas da diferença entre português de Portugal e do Brasil.

eu queria usar dessa forma...

Defina "forma". O que queres dizer com isso?

polimorfismo de objectos, em vez de classes...

Um objeto é uma entidade que representa uma classe naquele contexto. Objetos são instancias de classes, não tem sentido falar "qualquer coisa de objeto" seguido de "em vez de classes" porque não existem objetos sem classes.

Um objeto só pode ter varias (poli) formas (mórficas) se tu definir estas varias formas previamente, de maneira que o código saiba como o objeto se comporta em função da situação. Então é imprescindível construir o tipo do objeto. E construir o tipo é construir sua classe.

Você pode também definir uma função (e isso não é um objeto!) com vários comportamentos e será igualmente polimórfica. Se o que queres fazer, seja la o que for, pode ser feita em termos de uma mesma chamada com vários comportamentos já tens polimorfismo.

da-me esses erros.

Que erros?

posso o fazer em C++?

Eu realmente não sei de que língua estas a falar. Mas eu desde sempre estou a falar do C++.

Link para o comentário
Compartilhar em outros sites

Não percebo a duvida e nem mesmo a pergunta.

Alguma vezes eu acho que usas os termos técnicos completamente fora de contexto. O que me leva a crer que ou tu não sabe o que é, ou aprendeu uma definição equivocada. Nesse caso, o uso do termo polimorfismo, na teu post não faz nenhum sentido pra mim. Ou isso, ou somos todos vitimas da diferença entre português de Portugal e do Brasil.

Defina "forma". O que queres dizer com isso?

Um objeto é uma entidade que representa uma classe naquele contexto. Objetos são instancias de classes, não tem sentido falar "qualquer coisa de objeto" seguido de "em vez de classes" porque não existem objetos sem classes.

Uma objeto só pode ter varias (poli) formas (mórficas) se tu definir estas varias formas previamente, de maneira que o código saiba como o objeto se comporta em função da situação. Então é imprescindível construir o tipo do objeto. E construir o tipo é construir sua classe.

Você pode também definir uma função (e isso não é um objeto!) com vários comportamentos e será igualmente polimórfica. Se o que queres fazer, seja la o que for, pode ser feita em termos de uma mesma chamada com vários comportamentos já tens polimorfismo.

Que erros?

Eu realmente não sei de que língua estas a falar. Mas eu desde sempre estou a falar do C++.

desculpa a confusao. provavelmente o erro é 100% meu...

mas me deixa fazer-te outra pergunta diferente...

ve esta class:

class test
{
public:
virtual void write(string a)
{
cout << a;
}
};

class test1: public test
{
public:
void write(string a);
}test1;

me responde: na class test1, posso evitar as 2 linhas??? ou fazer algo que chame a class derivada? o meu objectivo é evitar:

 public:
void write(string a);

e poder, na mesma, chamar os membros da class derivada... é possivel em C++?

Link para o comentário
Compartilhar em outros sites

Não sei que complicações aquele virtual ali na classe base pode trazer. Porque é algo que não uso muito.

Mas considerando que não será um problema, sim você pode evitar:


public:
void write(string a);

Porque test1 herdou write() da test. Herança entre classes existe exatamente pra evitar reescrever trechos de código.

Mas cuidado, no teu pedaço de código não estou considerando a keyword virutal.

Link para o comentário
Compartilhar em outros sites

Não sei que complicações aquele virtual ali na classe base pode trazer. Porque é algo que não uso muito.

Mas considerando que não será um problema, sim você pode evitar:


public:
void write(string a);

Porque test1 herdou write() da test. Herança entre classes existe exatamente pra evitar reescrever trechos de código.

Mas cuidado, no teu pedaço de código não estou considerando a keyword virutal.

ve o codigo:

#include <iostream>

using namespace std;

class test
{
public:

void write(string a)
{
cout << a;
}
};

class test1: public test
{
}test1;

void test1::write(string a)
{
cout << "hello " << a << "\n";
}

int main()
{
test1.write("joaquim");
cin.get();
return 0;
}

mensagem de erro:

"error: no 'void test1::write(std::string)' member function declared in class 'test1'"

então o porque do erro?

Link para o comentário
Compartilhar em outros sites

Veja se é isto que quer, Cambalinho.

#include <iostream>

using namespace std;

class test
{
public:
void write()
{
cout << "Cambalinho";
}
};

class test1: public test
{
public:
using test::write;
void write(string a)
{
cout << "hello " << a << "\n";
}
};

int main()
{
test1 t1;

t1.write("joaquim");
t1.write();

cin.get();

return 0;
}

Dê uma lida aqui, Cambalinho: http://msdn.microsoft.com/en-us/library/vstudio/was37tzw.aspx

LNW

Link para o comentário
Compartilhar em outros sites

Veja se é isto que quer, Cambalinho.

#include <iostream>

using namespace std;

class test
{
public:
void write()
{
cout << "Cambalinho";
}
};

class test1: public test
{
public:
using test::write;
void write(string a)
{
cout << "hello " << a << "\n";
}
};

int main()
{
test1 t1;

t1.write("joaquim");
t1.write();

cin.get();

return 0;
}

Dê uma lida aqui, Cambalinho: http://msdn.microsoft.com/en-us/library/vstudio/was37tzw.aspx

LNW

desculpa, mas não é isso :(

(sem declaraçao)

ve outro exemplo(ve a macro para perceberes):

#include <iostream>
#include <functional>

#define WithEvents(x,y) class y: public x{;}y;

using namespace std;

class test
{
public:
std::function<void(string)> write=[](string a){;};
};

WithEvents(test,test1);

void test1::write=[](string Name) //erro: "variable or field 'write' declared void"
{
cout << "hello " << Name << "\n";
};

int main()
{

test1.write("joaquim");
cin.get();
return 0;
}

se der para alterar valores com '::' (na secçao que usei)ja fico muito contente ;)

o codigo pode ser corrigido como eu pretendo?

Link para o comentário
Compartilhar em outros sites

Veja bem, quando você declara,


int A;

Você criou um objeto chamado A da classe int. Ok? Acho que é claro pra todos nós que


int;

não faz sentido. Muito menos,


A;


void A;

Agora declaramos algo sem tipo. O que o compilador vai fazer com isso? se ele nem sabe o que é. Não tem sentido porque não existe objetos sem tipo.

Agora presta atenção no que estas a fazer:


int main()
{
[COLOR="Red"]test1[/COLOR].write("joaquim");
cin.get();
return 0;
}

test1 é um tipo. Como queres que funcione se não declaras previamente o objeto? sem objeto não vai funcionar.

Se não quiser usar classes, crie um namespace, declare suas funções e dados dentro desse namespace e, claro, namespaces não precisam criar objetos.


namespace test1
{
write();
}

int main()
{
test1::write("joaquim");
cin.get();
return 0;
}

Mas definitivamente com classes e structs não funciona sem objeto. Isso viola a orientação a objetos.

Link para o comentário
Compartilhar em outros sites

Veja bem, quando você declara,


int A;

Você criou um objeto chamado A da classe int. Ok? Acho que é claro pra todos nós que


int;

não faz sentido. Muito menos,


A;


void A;

Agora declaramos algo sem tipo. O que o compilador vai fazer com isso? se ele nem sabe o que é. Não tem sentido porque não existe objetos sem tipo.

Agora presta atenção no que estas a fazer:


int main()
{
[COLOR="Red"]test1[/COLOR].write("joaquim");
cin.get();
return 0;
}

test1 é um tipo. Como queres que funcione se não declaras previamente o objeto? sem objeto não vai funcionar.

Se não quiser usar classes, crie um namespace, declare suas funções e dados dentro desse namespace e, claro, namespaces não precisam criar objetos.


namespace test1
{
write();
}

int main()
{
test1::write("joaquim");
cin.get();
return 0;
}

Mas definitivamente com classes e structs não funciona sem objeto. Isso viola a orientação a objetos.

desculpa mas tu vistes a macro que fiz no codigo?

Link para o comentário
Compartilhar em outros sites

class A
{
public:
virtual void Write()
{
std::cout << "A";
}
};

class B : public A
{
public:
void Write()
{
A::Write();
std::cout << "B";
}
};

não entendo o porque de tanta frescura.

desculpa.. aserio... nao fiques chateado, mas ainda nao consegui a resposta :(

class A
{
public:
virtual void Write()
{
std::cout << "A";
}
};

class B : public A
{

}B;

void B::Write()
{
std::cout << "hello world";
}

ve estes pontos:

1 - na class B, nao declarei nada mas esta 'ligada' á class A publicamente;

2 - como ves, estou a alterar a funçao Write(ate podia falar de 1 variavel) a partir da class B e na area global.

é disto que preciso... mas o C++ nao aceita. só aceita 1 re-declaraçao de 1 variavel 'static' :(

Link para o comentário
Compartilhar em outros sites

class B : public A
{
public:
void Write()
{
A::Write();
std::cout << "B";
}
};

e

class B : public A
{
public:
void Write();
};
void B::Write()
{
A::Write();
std::cout << "B";
}

são exatamente a mesma coisa. Na verdade você esta com frescura, pare de reclamar e vá produzir coisas legais.

Link para o comentário
Compartilhar em outros sites

class B : public A
{
public:
void Write()
{
A::Write();
std::cout << "B";
}
};

e

class B : public A
{
public:
void Write();
};
void B::Write()
{
A::Write();
std::cout << "B";
}

são exatamente a mesma coisa. Na verdade você esta com frescura, pare de reclamar e vá produzir coisas legais.

eu nao conheço esse termo 'frescura', mas, pelo contexto, devo entender ;)

algo legal que ja fiz foram:

1 - 1 tipo de variavel que aceita funções(lambada ou o endereço de 1 funçao);

2 - como era template tinha de repetir os argumentos. então fiz 1 macro para me facilitar ;) ;

3 - ja fiz 1 mini jogo para Linha de Comandos(console), usando funçoes API;

4 - fiz 1 class Sprite para poder receber e mostrar as imagens mais facilmente;

5 - nao me lembro... mas estou a fazer 1 class muito legal para usar a Linha de Comandos com mais facilidade e com muitos com muitas propriedades e comandos...

isto nao é legal para quem nao é PRO? ;)

ainda estou sem resposta para o meu problema, mas hei-de descubrir(ás vezes demora e da-me dor de cabeça, mas chego la sempre lol) ;)

muito obrigado a todos...

depois volto ;)

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!