Ir ao conteúdo
  • Cadastre-se

C++ Erro: Declaração indefinida(não entendo)


Ariel H.s

Posts recomendados

Ola a todos!!!

  Eu sou novo na programação orientada à objetos, e já estou estudando sobre Classes e Objetos, e também já entendo de C. Neste momento estou estudando C++ pelo livro do Deitel, e nele me deparei com um exemplo de programa, que é dividido em três arquivos, o arquivo de cabeçalho para declarar a Classe que vou usar, o arquivo fonte para declarar as funções membro, e o arquivo que utiliza a Classe (o programa mesmo). Eu copiei o código corretamente, mas por algum motivo meu compilador apresenta a mensagem "undefined reference to 'função' ", e mostra para todas as funções da Classe. Para ilustrar melhor, vou colocar o código aqui separado pelos seus arquivos, caso alguma duvida com a função do programa, me avise.

 

Obs: os três arquivos estão todos no mesmo diretório

_____________________________________________________________________________

Arquivo "time1.h"_______________________________________________________________

#ifndef TIME1_H
#define TIME1_H

class Time{
public:
    Time();
    void setTime(int,int,int);
    void printMilitary();
    void printStandard();
private:
    int hour;
    int minute;
    int second;
};

#endif // TIME1_H

____________________________________________________________________________

Arquivo "time1.cpp"____________________________________________________________


 

#include <iostream>

using std::cout;

#include "time1.h"

Time::Time() {hour=minute=second=0;}

void Time::setTime(int h, int m, int s)
{
    hour = (h >= 0 && h < 24) ? h : 0 ;
    minute = (m >= 0 && s < 60) ? m : 0 ;
    second = (s >= 0 && s < 60) ? s : 0 ;
}

void Time::printMilitary()
{
    cout << (hour < 10 ? "0" : " ") << hour << ":"
         << (minute < 10 ? "0" : " ") << minute;
}

void Time::printStandard()
{
    cout << ((hour == 0 || hour == 12)? 12:hour%12)
         << ":" << (minute < 10 ? "0" : " ") << minute
         << ":" << (second < 10 ? "0" : " ") << second
         << (hour < 12 ? " da manha" : " da tarde");
}

_______________________________________________________________________

Arquivo "fig06_05" que contêm main()_________________________________________

 

/// ONDE ESTÁ O ERRO ??? ///

#include <iostream>

using std::cout;
using std::endl;

#include "time1.h"

int main()
{
    Time t;

    cout << "A hora militar inicial e ";
    t.printMilitary();
    cout << "\nA hora padrão inicial e ";
    t.printStandard();

    t.setTime(13,27,6);
    cout<<"\n\nHora militar depois de setTime e ";
    t.printMilitary();
    cout << "\nHora padrão depois de setTime e ";
    t.printStandard();

    t.setTime(99,99,99);
    cout <<"\n\nApos tentar inicializacao invalida\n"
         <<"Hora militar: ";
    t.printMilitary();
    cout<<"\nHora padrão: ";
    t.printStandard();
    cout << endl;
    return 0;
}


________________________________________

 

para o ultimo arquivo, o compilador mostra o erro undefined reference to 'Time::Time()', assim como para todas as outras funções membro da classe Time.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

"Tente incluir o arquivo "time1.cpp" ao invés do #include "time1.h"."_ pode ser que funcione, apesar do autor não ter citado isso no livro. 

 

"Eu coloquei seu código aqui e compilou certinho."_ Isso tá mais estranho ainda, kkk, pois eu também uso o Code::Blocks, porém não funciona. Não podemos dizer que é bug no compilador

 

Edit: uma coisa que reparei na print que me mandou, os arquivos foram aberto em modo projeto no code::blocks, pode ser que seja isso, já que eu abri cada arquivo individualmente.

 

+Edit: Parece que funcionou, eu abri os arquivos em modo project e o programa rodou perfeitamente, então não é um erre no código. Mas eu queria entender mais sobre anexar os arquivos, pois usando eles no mesmo diretório apenas não funciona.

 

Edit Final:  CiroboyBR, incluir o arquivo time1.cpp também funcionou, valeu aê cara.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Em 19/12/2017 às 10:42, Ariel H.s disse:

Edit: uma coisa que reparei na print que me mandou, os arquivos foram aberto em modo projeto no code::blocks, pode ser que seja isso, já que eu abri cada arquivo individualmente.

Essa era uma dúvida que eu também tinha, eu sempre vejo essa maneira de organizar arquivos incluindo o .h, mas comigo nunca funcionou, pois o .cpp não era incluído e pra mim não fazia lógica:

O main.cpp inclui o .h

O arq.cpp inclui o .h

o arq.h não inclui nada

Quando se compila o main.cpp, ele puxa o código do arq.h, mas o arq.cpp não é incluído em lugar algum. Eu olhei alguns makefiles e percebi que poderia contornar essa situação compilando manualmente os arquivos através de linha de comando do mingw, no compilador ficaria algo assim:

gcc -c main.cpp arq.cpp //gera os objetos. COMPILA

gcc main.o arq.o -o saida.exe //linka os objetos MONTA

Enfim, creio que seja isso que  projeto faça, ele gera um makefile que compila todos os .c/.cpp, gerando seus respectivos objetos .o, após isso eles são montados em um único executável, as vezes com bibliotecas, ex de uma linkagem com a biblioteca allegro 5:

gcc main.o agar.o -o agar -lallegro -lallegro_primitives -lallegro_font -lallegro_ttf -lallegro_image -lm

Fonte: https://github.com/CiroboyBR/Allegro_SummerHW_2015_AgarIO

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  Hum, entendo. Mas foi bom você ter dito para incluir o arquivo .cpp mesmo, pois nos livros isso não tinha aparecido (pelo menos ainda), assim eu pensava que só podia usar #include para arquivos .h, rsrs. Enfim, é bem mais prático usar esse método, incluir apenas o arquivo .cpp, já que o main.cpp inclui função.cpp que inclui função.h, e ainda posso especificar o diretório dos arquivos se não me engano,

 

assim:  #include "C:\Users\Meu PC\Desktop\EXERCICIOS_C_2\C++\Trabalhando com classes\função.cpp" pode ser uma boa escolha.

  valeu mesmo cara, tudo de bom e Falou

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...