Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Ariel H.s

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

Recommended Posts

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.

Editado por DiF
Botão CODE <>
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu coloquei seu código aqui e compilou certinho. 

 

2xklArd.png

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
 

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.

Tente incluir o arquivo "time1.cpp" ao invés do #include "time1.h".

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • "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.

     

    Editado por Ariel H.s
    lembrei de algo
    • Curtir 1

    Compartilhar este post


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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  •   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

    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






    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

    ×