CarlosTex Posted May 29, 2014 at 06:36 PM Report #557582 Posted May 29, 2014 at 06:36 PM (edited) Boas pessoal. Há pouco tempo comecei a dar Java e já chegámos à parte de OOP. Estou a achar OOP em Java extremamente simples e fácil de implementar. Antes de Java tive a dar C++, mas vá se saber lá porquê não incluiram a parte de OOP para C++ na matéria a dar. Por isso estou a tentar ver OOP por mim em C++, e para já estou a ter muitos mais problemas a implementar do que em Java. Por exemplo, não consigo compilar o seguinte código (dá me undefined references no construtor e nos métodos): Bancotuga.h: #ifndef BANCOTUGA_H #define BANCOTUGA_H class Bancotuga { private: float saldo; public: Bancotuga(); std::string nome; float mostraSaldo(); float depositaSaldo(float valor); float retiraSaldo(float valor); }; #endif Bancotuga.cpp: #include "Bancotuga.h" Bancotuga::Bancotuga() { saldo = 0; nome = "Cliente"; } Bancotuga::mostraSaldo() { return saldo; } Bancotuga::depositaSaldo(float valor) { saldo+=valor; } Bancotuga::retiraSaldo(float valor) { saldo-=valor; } main.cpp: #include <iostream> #include "Bancotuga.h" using namespace std; int main() { Bancotuga obj1; float val = 0; cout << "Introduza valor para depositar: " << endl; cin >> val; obj1.depositaSaldo(val); cout << "Nome: " << obj1.nome << "\nSaldo: " << obj1.mostraSaldo(); cin.get(); return 0; } Não percebo o que estou a fazer mal, mas n ão consigo compilar isto. Se alguém puder explicar porque não funciona é uma grande ajuda para continuar a perceber OOP em C++. Obrigado! Edited May 29, 2014 at 06:37 PM by CarlosTex
HappyHippyHippo Posted May 29, 2014 at 07:07 PM Report #557591 Posted May 29, 2014 at 07:07 PM - qual a assinatura das funções que dão o erro ? - qual a declaração das funções implementadas ? - são iguais ? NOTA: responde às perguntas, eu sei a resposta e não interessa responder a coisas que não fazem parte das questões colocadas se responderes correctamente às questões, verás imediatamente onde está o erro IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
CarlosTex Posted May 29, 2014 at 07:39 PM Author Report #557596 Posted May 29, 2014 at 07:39 PM (edited) As funções e o constructor que dão erro: Bancotuga::Bancotuga() Bancotuga::mostraSaldo() Bancotuga::retiraSaldo(float) Bancotuga::retiraSaldo(float) C:\Users\Tex\Documents\programacao C++\OOP\main.o:main.cpp|| undefined reference to `Bancotuga::Bancotuga()'| C:\Users\Tex\Documents\programacao C++\OOP\main.o:main.cpp|| undefined reference to `Bancotuga::depositaSaldo(float)'| C:\Users\Tex\Documents\programacao C++\OOP\main.o:main.cpp|| undefined reference to `Bancotuga::retiraSaldo(float)'| C:\Users\Tex\Documents\programacao C++\OOP\main.o:main.cpp|| undefined reference to `Bancotuga::mostraSaldo()'| ||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===| As funções estão declaradas no Bancotuga.h dentro da classe e são públicas. Só as inicializo no ficheiro Bancotuga.cpp e uso os :: para poder estar no scope da classe. Se são iguais? Sim a diferença é que como disse utilizo no cpp :: para as poder inicializar. Pelo que estou a ver, ou eu não estou a perceber como se implementa em C++ ou simplesmente tou a usar mal a sintaxe. Sou sincero estou mesmo confuso com isto, pelo que tenho estado a estudar sozinho tinha a sensação que está tudo bem declarado e inicializado, mas sinceramente já não sei EDIT: Reparei que duas funções não necessitam ser float visto que não retornam valor nenhum, mas de qualquer das maneiras não é aí que está o problema. Edited May 29, 2014 at 07:45 PM by CarlosTex
shumy Posted May 29, 2014 at 07:50 PM Report #557597 Posted May 29, 2014 at 07:50 PM Mais uma vez, são iguais? Olha bem: float mostraSaldo() e ? Bancotuga::mostraSaldo() Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!
CarlosTex Posted May 29, 2014 at 08:08 PM Author Report #557599 Posted May 29, 2014 at 08:08 PM (edited) Bom então a solução é float Bancotuga::mostraSaldo() ? Porque o problema persiste para todas as funções e o construtor também. Digo mais: Se eu eliminar o ficheiro Bancotuga.cpp e fizer tudo no Bancotuga.h isto funciona tudo perfeitamente. Edited May 29, 2014 at 08:01 PM by CarlosTex
shumy Posted May 29, 2014 at 08:27 PM Report #557603 Posted May 29, 2014 at 08:27 PM 1. Como está agora o CPP? 2. Todo o output, 1º do compilador e 2º do linker. 3. Que compilador estás a utilizar, estás a incluir o objecto compilado Bancotuga.o no processo de link? O facto de funcionar com tudo no .h é porque o main.cpp com todos os seus includes formam uma unidade de compilação (estando o código e as referências todas disponíves nessa unidade). Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!
CarlosTex Posted May 29, 2014 at 08:58 PM Author Report #557605 Posted May 29, 2014 at 08:58 PM (edited) 1- #include "Bancotuga.h" Bancotuga::Bancotuga() { saldo = 0; nome = "Cliente"; } float Bancotuga::mostraSaldo() { return saldo; } void Bancotuga::depositaSaldo(float valor) { saldo+=valor; } void Bancotuga::retiraSaldo(float valor) { saldo-=valor; } Não sei se consigo responder ás restantes questões, o compilador continua a dar os mesmos erros que dá em cima. No entanto estou a ver que o facto de nunca ter feito OOP é a razão pela qual me falta qualquer coisa em configurações de compilador e não tanto em problemas de código. Tentei agora por o Bancotuga.cpp no linker. Compilei e agora dá me só um erro meio estúpido: C:\Users\Tex\Documents\programacao C++\OOP\Bancotuga.h|9|error: 'string' in namespace 'std' does not name a type| C:\Users\Tex\Documents\programacao C++\OOP\Bancotuga.cpp||In constructor 'Bancotuga::Bancotuga()':| C:\Users\Tex\Documents\programacao C++\OOP\Bancotuga.cpp|7|error: 'nome' was not declared in this scope| ||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===| Então agora esta porra diz-me que não posso fazer std::string nome ? Já estou um bocadinho mais contente que o problema é muito mais que código. EDIT: Estou a usar o IDE Code Blocks com o GCC (MinGW). Edited May 29, 2014 at 08:59 PM by CarlosTex
HappyHippyHippo Posted May 29, 2014 at 09:07 PM Report #557607 Posted May 29, 2014 at 09:07 PM e então como esperarias que o linker saberia do código do ficheiro se não o adicionaste ? nem quero saber que raio de configurações andam praí ... segundo: a classe string está definida no header "string" #ifndef BANCOTUGA_H #define BANCOTUGA_H #include <string> IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
CarlosTex Posted May 29, 2014 at 09:32 PM Author Report #557611 Posted May 29, 2014 at 09:32 PM e então como esperarias que o linker saberia do código do ficheiro se não o adicionaste ? Não quero dizer isto como desculpa, mas em tudo o que aprendi no curso nunca foi preciso mexer nas configurações padrão. Isto é mesmo daquelas coisas que eu não fazia ideia. Fui ver uns tutoriais, vi os conceitos de OOP em C++ e tentei fazer uma coisa simples. Como vi que toda a gente recomendava fazer só declarações na header e depois meter construtores e tudo mais noutro cpp decidi tentar logo aprender esse caminho. Lá está só comecei a desconfiar que faltava alguma coisa em configurações foi quando comecei a ver que o código estava todo bem, e até exemplos que tirei da net davam o mesmo problema. Como o curso são só 300 horas (50 para Inglês), 250 para os módulos de programação em que 50 das quais eu não aprendi nada porque ás vezes há pessoas que nem sabem ligar um computador (quanto mais programação) não houve muitas horas para ver matéria. Felizmente na parte de algoritmia deu para trabalhar bastante e aprender algumas coisas. As 50 últimas horas são para Java, onde estou agora. Bom de qualquer das formas agradeço a todos, já percebi como devo fazer para conseguir compilar tudo correctamente, e assim daqui em diante só me tenho que preocupar com o código que escrevo.
HappyHippyHippo Posted May 29, 2014 at 09:47 PM Report #557614 Posted May 29, 2014 at 09:47 PM o que estou a ler é somente desculpa ou exemplos de tutoriais que nem deveriam existir vamos ver a tua experiência de Java tens os ficheiros *.java, terás de compilar cada um para um ficheiro *.class no final necessitas de combinar cada um dos ficheiros *.class para poder executar a tua aplicação. agora vamos ver em C ou C++ tens os ficheiros *.c/*.cpp, terás de compilar cada um para um ficheiro *.o no final necessitas de combinar cada um dos ficheiros *.o para poder executar a tua aplicação. agora explica lá qual é realmente a diferença ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
CarlosTex Posted May 30, 2014 at 03:41 PM Author Report #557696 Posted May 30, 2014 at 03:41 PM o que estou a ler é somente desculpa ou exemplos de tutoriais que nem deveriam existir cada um acredita no que quiser, eu estou a ser sincero, e quanto aos tutoriais eu tenho que me agarrar a tudo o que seja documentação e tutoriais sobre OOP em C++ visto que nunca me ensinaram isto no curso. Se eu não puser as mãos ao trabalho e tentar aprender por mim também mais ninguém me vai ensinar. vamos ver a tua experiência de Java tens os ficheiros *.java, terás de compilar cada um para um ficheiro *.class no final necessitas de combinar cada um dos ficheiros *.class para poder executar a tua aplicação. agora vamos ver em C ou C++ tens os ficheiros *.c/*.cpp, terás de compilar cada um para um ficheiro *.o no final necessitas de combinar cada um dos ficheiros *.o para poder executar a tua aplicação. agora explica lá qual é realmente a diferença ? A minha experiência em Java é quase 0, tenho apenas umas 30 horas de aprendizagem. NUNCA nenhum formador nos ensinou como deveriam ser configurados os settings dos compilers nos IDE's, tanto no Code::Blocks ou Dev C++ para C e C++ como também o Eclipse que estamos a utilizar para Java. Aliás quando começamos a aprender Java não só nada nos foi dito sobre linkers como o próprio Eclipse não necessita de nenhuma configuração adicional, ou pelo menos até agora nunca necessitei. Em tudo que fiz em OOP em Java o Eclipse sempre fez tudo automaticamente visto que criámos projectos onde ficam todas as classes e packages. Eu posso ter sido é ingénuo ao pensar que o Code::Blocks iria também fazer o mesmo por mim e ter me esquecido do pormenor em que estava a criar ficheiros á parte e não a fazer projecto onde eu assumo que o linker (que não fazia ideia o que era até o membro schumy aqui ter mencionado) também fique logo com as associações necessárias para compilar tudo como deve de ser. Como não nasci ensinado nem sou bruxo, vim pedir ajuda a quem percebe muito mais disto do que eu. Por isso mais uma vez agradeço a quem me ajudou, porque agora fiquei a perceber como tenho de fazer. Epá se acharem que isto é um monte de balelas tudo bem, levem lá a bicicleta, eu só quero aprender mais um bocadinho.
thiago ribeiro de sa Posted June 2, 2014 at 08:27 AM Report #557872 Posted June 2, 2014 at 08:27 AM Exelente questão. Eu também estava tentando entender POO em c++. Sou do brasil e vejo que o português daí muda um pouco. Muito interessante isso!!!
HappyHippyHippo Posted June 2, 2014 at 08:37 AM Report #557874 Posted June 2, 2014 at 08:37 AM Como não nasci ensinado nem sou bruxo nem ninguém aqui é bruxo. a única coisa que se sabe é aquilo que dizes: Há pouco tempo comecei a dar Java e já chegámos à parte de OOP. Estou a achar OOP em Java extremamente simples e fácil de implementar. Antes de Java tive a dar C++, mas vá se saber lá porquê não incluiram a parte de OOP para C++ na matéria a dar. Por isso estou a tentar ver OOP por mim em C++, e para já estou a ter muitos mais problemas a implementar do que em Java. por estas palavras, o que se pode inferir é que sabes fazer o que tens de fazer em Java -------------------------------------- Exelente questão. Eu também estava tentando entender POO em c++. Sou do brasil e vejo que o português daí muda um pouco. Muito interessante isso!!! podes seguir vários tutoriais e/ou referências a informação na secção de C++ do fórum. qualquer dúvida é só apresentar IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now