Jump to content

Recommended Posts

Posted (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 by CarlosTex
Posted

- 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
Posted (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 by CarlosTex
Posted

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!

Posted (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 by CarlosTex
Posted

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!

Posted (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 by CarlosTex
Posted

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
Posted

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.

Posted

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
Posted

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.

Posted

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.