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:  
Dhenyson Jhean

C++, como interagir arquivo "main.cpp" com arquivo "cabeçalho.h" e "cabeçalho.cpp"

Recommended Posts

Olá, vou direto ao assunto porque vai ser um pouco grande e complicado de explicar.
Estou acompanhando um livro (C++ como programa 5º edição, Deitel) da minha faculdade. E fiz um programa que tem 3 arquivos.


GradeBook.h --> o cabeçalho do programa, aqui apenas vou DECLARAR as funções
GradeBook.cpp --> Aqui eu vou "importar" as funções declaradas em GradeBook.h e vou criar um corpo para elas.
main.cpp --> Nesse aqui eu devo "importar" GradeBook.h para acessar suas funções (lembrando que as funções de .h estar em outro arquivo "GradeBook.cpp")

Conclusão, o objetivo é criar um cabeçalho que eu possa usar suas funções em outro programa, PORÉM o cabeçalho NÃO pode ter o corpo das funções por questão de segurança de dados, se no meu programa eu incluir "GradeBook.cpp" que é o arquivo onde está o corpo das funções de GradeBook.h, não vai adiantar de nada esse esforço...

________________________________________
//Arquivo --> GradeBook.h = cabeçalho

#include <string>

using namespace std;

class GradeBook {

public:

GradeBook(string); //Isso é um construtor que server para iniciar courseName
void setCourseName(string);
string getCourseName();
void displayMessage();

private:
string courseName;
_________________________________________
//Arquivo --> GradeBook.cpp

#include <iostream>
#include "GradeBook.h"

using namespace std;

GradeBook::GradeBook(string name) {
setCourseName(name);
}

void GradeBook::setCourseName(string name) {

if (name.length() <= 25) { //se o tamanho da string name for <= 25
courseName = name;

if (name.length() > 25) { //se o tamanho da string name for > 25
courseName = name.substr(0, 25); //courseName recebe apenas os primeiros 25 caracteres, começando do 0
cout<<"Name \""<<name<<"\" exceeds maximum lenght (25).\n"
<<"Limiting courseName to first 25 characters.\n"<<endl;
}
}

string GradeBook::getCourseName() {
return courseName;
}

void GradeBook::displayMessage() {
cout<<"Welcome to the Grade Book for\n"<<getCourseName()<<"!"<<endl;
}
____________________________________________
//arquivo --> main.cpp

#include <iostream>

//A proxima linha é que esta o erro, não dar erro na verdade, mas era pra está incluindo
// o arquivo "GradeBook.h" igual o livro, mas o meu só funciona incluindo "GradeBook.cpp"
#include "GradeBook.cpp"

using namespace std;

int main() {

GradeBook gradeBook1("Nome do primeiro curso.");
GradeBook gradeBook2("Nome do segundo curso");

cout<<"gradeBook1 created for course: "<<gradeBook1.getCourseName()
<<"\ngradeBook2 created for course: "<<gradeBook2.getCourseName()
<<endl;

return 0;
}

Editado por Dhenyson Jhean

Compartilhar este post


Link para o post
Compartilhar em outros sites
olliver.soul    170

Depende da forma que você está compilando.

 

Se estiver usando uma IDE, normalmente é criando um projeto e ir acrescentando os arquivos c/cpp...

 

Se for via linha de comando, geralmente basta informar os nomes dos arquivos

Compartilhar este post


Link para o post
Compartilhar em outros sites
Dhenyson Jhean    0
  • Autor do tópico
  • Depende da forma que você está compilando.

     

    Se estiver usando uma IDE, normalmente é criando um projeto e ir acrescentando os arquivos c/cpp...

     

    Se for via linha de comando, geralmente basta informar os nomes dos arquivos

     

    Estou usando Notepad++ . Eu ja tentei informar o nome de .h mas da erro. Por favor você pode apenas copiar esses arquivos e colar e compilar? Eu já estou na pagina 250 do livro e estou acompanhando sem problema, porém esse detalhe não me deixa em paz e não consigo estudar até resolver isso. No arquivo main deve está incluindo GradeBook.h e não .cpp  :(

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    olliver.soul    170

    Em main.cpp você está incluindo o cpp, altere para incluir o .h

     

    Compilei seu programa no g++ com essa alteração e deu certo, da seguinte forma: g++ GradeBook.cpp main.cpp -o main

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Dhenyson Jhean    0
  • Autor do tópico
  • Em main.cpp você está incluindo o cpp, altere para incluir o .h

     

    Compilei seu programa no g++ com essa alteração e deu certo, da seguinte forma: g++ GradeBook.cpp main.cpp -o main

    Esse que é o problema, quando eu altero para .h da erro na compilação, talvez o problema deve ser meu compilador. Vou tentar outro compilador. Mas o erro que da é esse:

    _____________________________

    C:\Users\Dhenyson\AppData\Local\Temp\ccV4QCLm.o main.cpp:(.text+0x48): undefined reference to `GradeBook::GradeBook(std::string)'

    C:\Users\Dhenyson\AppData\Local\Temp\ccV4QCLm.o main.cpp:(.text+0x94): undefined reference to `GradeBook::GradeBook(std::string)'

    C:\Users\Dhenyson\AppData\Local\Temp\ccV4QCLm.o main.cpp:(.text+0xbb): undefined reference to `GradeBook::getCourseName()'

    C:\Users\Dhenyson\AppData\Local\Temp\ccV4QCLm.o main.cpp:(.text+0xce): undefined reference to `GradeBook::getCourseName()'

    c:\program files (x86)\dev-cpp\mingw32\mingw32\bin\ld.exe C:\Users\Dhenyson\AppData\Local\Temp\ccV4QCLm.o: bad reloc address 0xf in section `.text$_ZN9GradeBookD1Ev[__ZN9GradeBookD1Ev]'

     

    c:\program files (x86)\dev-cpp\mingw32\mingw32\bin\ld.exe final link failed: Invalid operation

    C:\Users\Dhenyson\SkyDrive\programacao\cpp\OO\02\collect2.exe [Error] ld returned 1 exit status

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    olliver.soul    170

    Esse erro acontece porque você continua com

    #include "GradeBook.cpp"

    no main.cpp.

     

    Quando tentei compiar da primeira vez também tive esse erro, mas bastou mudar para

    #include "GradeBook.h"
    que compilou corretamente. Editado por olliver.soul
    • Curtir 1

    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

    ×