Ir ao conteúdo
  • Cadastre-se
Joanderson Pereira

C++ C++ Deitel >> Exemplo incorreto?

Recommended Posts

Estou estudando programação na linguagem C++ seguindo o livro "C++ Como programar 5° edição" da Deitel, até aí tudo bem.

Na introdução de separando a interface da implementação, copiei de acordo com o exemplo que o livro fornece, porém o compilador não está rodando o programa, ele acusa os seguintes erros:

Em GradeBook > 23  14    C:\Users\User\Downloads\Códigos Fontes\GradeBook.cpp    [Error] 'std::string' has no member named 'lenght';
Em GradeBook.h > C:\Users\User\Downloads\Códigos Fontes\collect2.exe    [Error] ld returned 1 exit status;
Em main > C:\Users\User\AppData\Local\Temp\ccTQ0CPX.o    main.cpp:(.text+0x48): undefined reference to `GradeBook::GradeBook(std::string)' esse utimo erro acontece em todas as funções-membro do objeto.

 

Estou usando o Dev-C++ 5.11

_________________________

// Figura 3.15: GradeBook.h
// Definição da classe GradeBook apresenta a interface public da
// classe. Definições de função-membro aparecem em GradeBook.cpp.
#include <string> // a classe GradeBook utiliza a classe de string padrão C++
using std::string;

// definição da classe GradeBook
class GradeBook
{
public:
    GradeBook ( string ); // construtor que inicializa courseName
    void setCourseName ( string ); // função que configura o nome do curso
    string getCourseName(); // função que obtém o nome do curso
    void displayMessage(); // função que exibe uma mensagem de boas-vindas
private:
    string courseName; // nome do curso para esse GradeBook
}; // fim da classe GradeBook

_________________________________

// Figura 3.16: GradeBook.cpp
// Implementações das definições da função-membro de GradeBook.
// A função setCourseName realiza a validação.
#include <iostream>
using std::cout;
using std::endl;

#include "GradeBook.h.cpp"// inclui a definição da classe GradeBook

// o construtor inicializa courseName com a string fornecida como argumento
GradeBook::GradeBook ( string name )
{
    setCourseName ( name ); // chama a função set para inicializar courseName
} // fim do construtor Gradebook
   
// função para configurar o nome do curso
// assegura que o nome do curso tenha no máximo 25 caracteres
void GradeBook::setCourseName ( string name )
   {
      if ( name.length() <= 25 ) // se o nome tiver 25 ou menos caracteres
       courseName = name; // armazena o nome do curso no objeto
       
      if ( name.lenght() > 25 ) // se o nome tiver mais que 25 caracteres
   {   
      //configura courseName como os primeiros 25 caracteres do parâmetro name
      courseName = name.substr( 0, 25 ); // inicia em 0, comprimento de 25
      
      cout << "Name\"" << name <<"\" exceeds maximum length (25).\n"
      << "Limiting courseName to first 25 characters.\n" << endl;
   } // fim do if
} // fim da função setCourseName
   
// função para obter o nome do curso
string GradeBook::getCourseName()
{
    return courseName; // retorna courseName do objeto
} // fim da função getCourseName
   
// exibe uma mensagem de boas-vindas para o usuário Gradebook
void GradeBook::displayMessage()
{
    // chama getCourseName para obter o courseName
    cout << "Welcome to the grade book for\n" << getCourseName()
    << "!" << endl;
} // fim da função displayMessage

________________________________________________

// Figura 3.17: fig03_17.cpp
// Cria e manipula um objeto GradeBook; ilustra a validação
#include <iostream>
using std::cout;
using std::endl;

#include "GradeBook.h.cpp" // inclui a definição GradeBook

// a função  main inicia a execução do programa
int main ()
{
       // cria dois objetos GradeBook;
       // nome inicial de curso gradeBook1 é muito longo
       GradeBook gradeBook1("CS101 Introduction to Programming in C++");
       GradeBook gradeBook2("CS102 Data structures in C++");
             
       // exibe valor inicial de courseName para cada gradeBook
        cout << "gradeBook1 created for course: "
           << gradeBook1.getCourseName()
           << "\ngradeBook2 created for course: "
           << gradeBook2.getCourseName() << endl;
          
       // modifica courseName do myGradeBook (com uma string de comprimento válido)
       gradeBook1.setCourseName( "CS101 C++ Programming" );
       
       //exibe courseName de cada GradeBook
       cout << "\ngradeBook1's course name is: "
          << gradeBook1.getCourseName()
          << "\ngradeBook2's course name is: "
          << gradeBook2.getCourseName() << endl;
        return 0;  // indica terminação bem-sucedida
} // fim de main

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Joanderson Pereira Olá. Apenas um erro na escrita: 

3 horas atrás, Joanderson Pereira disse:

name.lenght()

Seria isso:

3 horas atrás, Joanderson Pereira disse:

name.length()

 

com respeito ao outro problema:

3 horas atrás, Joanderson Pereira disse:

undefined reference to `GradeBook::GradeBook(std::string)

Devo confessar q até então não tinha visto essa abordagem:

using std::string;

std é um namespace em C++. Logo, a forma q aprendi e q me parece a correta seria essa para a classe GradeBook (por exemplo):

#include <string> // a classe GradeBook utiliza a classe de string padrão C++ #include <iostream>
using namespace std;

Essa mesma abordagem pode ser feita em outras partes do código.

Ao invés disso:

#include <iostream>
using std::cout;
using std::endl;

Fazer dessa forma:

#include <iostream>
using namespace std;

Assim, você poderá usar os comandos cout endl  normalmente em seu código

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Joanderson Pereira Seu código, de acordo com a maneira q aprendi, ficaria assim:

 

Arquivo GradeBook.h:

#include <string>
using namespace std;

class GradeBook
{
public:
    GradeBook(string); 
    void setCourseName(string); 
    string getCourseName();
    void displayMessage();
private:
    string courseName;
};

Arquivo GradeBook.cpp:

#include "GradeBook.h"

#include <iostream>
using namespace std;

GradeBook::GradeBook(string name)
{
    setCourseName(name); 
} 
  
void GradeBook::setCourseName(string name)
{
    if (name.length() <= 25) 
        courseName = name; 

    if (name.length() > 25) 
    {		
        courseName = name.substr(0, 25); 

        cout << "Name\"" << name << "\" exceeds maximum length (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 com o método main. Pode ser fig03_17.cpp

#include <iostream>
using namespace std;

#include "GradeBook.h"

int main()
{
    GradeBook gradeBook1("CS101 Introduction to Programming in C++");
    GradeBook gradeBook2("CS102 Data structures in C++");
	
    cout << "gradeBook1 created for course: "
        << gradeBook1.getCourseName()
        << "\ngradeBook2 created for course: "
        << gradeBook2.getCourseName() << endl;
	
    gradeBook1.setCourseName("CS101 C++ Programming");
	
    cout << "\ngradeBook1's course name is: "
        << gradeBook1.getCourseName()
        << "\ngradeBook2's course name is: "
        << gradeBook2.getCourseName() << endl;

    cout << endl;

    system("pause");

    return 0;
}

Procure não se incomodar muito com essa diferença em um  mesmo código.

Dê continuidade aos seus estudos e, tenha a certeza q, com o tempo, as coisas vão clareando p você, e devido a isso, você vai saber exatamente qual abordagem usar com relação a esse ou aquele comando.

obs: Não estou, de forma alguma, dizendo q a abordagem q o autor fez no livro mencionado está errada! Apenas estou passando o código da forma como aprendi.

Outro ponto importante: O ideal, em se tratando de um código como esse, orientado a objetos, é criar diferentes arquivo, do modo como passei.

Se você pegar esse código q passei e colocar em um arquivo .cpp só, q não é algo recomendado para se fazer, aí vai dar erro mesmo nas diretivas include 

Se surgir alguma dúvida, pergunte aqui, tal como fez agora. Não hesite em perguntar, ok?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela ajuda, eu descobri outro erro que ainda está me impedindo de executar a classe.

O arquivo GradeBook.h está salvo como cpp, acredito que isso não esteja permitindo utilizar ele como header.

Como posso salvá-lo como header?

prove c++.png

Compartilhar este post


Link para o post
Compartilhar em outros sites

***[ Olá, sou estudante de Ciências-Física, e tenho dialeto C ANSI como hobby, C'hobby rsrs!

      Meu contato com C/Python foi na matéria Introdução à Computação. ]

 

Pelo prompt de comando, e usando o comando RENAME

adicionado 1 minuto depois

Ou fazendo uma cópia do conteúdo e salvar o arquivo como sendo do tipo *.hpp, basta usar o bloco de notas, ou qualquer editor com opção de escolher a extensão do arquivo antes de salva.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Joanderson Pereira Olá. Apenas tem um ponto q esqueci de mencionar: No arquivo onde tem o método main, que está sendo chamado de fig03_17.cpp, é preciso incluir por meio da diretiva include a arquivo "GradeBook.cpp" também.

Seria isso:

#include <iostream>
using namespace std;

#include "GradeBook.h"
#include "GradeBook.cpp"
  
int main() {
 
   // código
   
}

Obs: Eu aprendi assim: .h, mas segundo o @AnsiC seria .hpp

Devo confessar q não me aprofundei muito no C++ por estar estudando C e, devido a isso, posso estar errado qto a essa questão da extensão do arquivo, que passei como .h (header)    (!?)

Outra dica q daria, apenas para organização, é colocar apenas os 3 arquivos em uma mesma pasta, própria para esse projeto

Outro ponto importante: É preciso incluir o comando #pragma once no início desse arquivo .h (ou .hpp)

Compartilhar este post


Link para o post
Compartilhar em outros sites
4 minutos atrás, giu_d disse:

Devo confessar q não me aprofundei muito no C++ por estar estudando C e, devido a isso, posso estar errado qto a essa questão da extensão do arquivo, que passei como .h (header)    (!?)

C++ é assim mesmo, aceita tudo pode ser: *.hpp; *.cc, *.h e *.H; C++ é meio assim! 

adicionado 2 minutos depois

Porém *.c e *.h são do C, daí como a linguagem é Cplusplus, fica: *.cpp, e *.hpp

para diferenciar de C!

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@AnsiC Olá. Nos projetos q criei até agora com o C++ usei o .h. Té rodei esse exercício do tópico agora mesmo e compilou tudo ok! 

Gostei da explicação quanto a extensão do arquivo!  Digamos... foi bem "original" :)

 

obs: Pra ver como estudando a gente vai aprendendo mesmo. Essa semana, lendo um livro sobre a linguagem C, é explicado a respeito do uso das aspas duplas e dos sinais < > ao incluir um arquivo de cabeçalho (biblioteca) em C/C++.

Se eu usar as aspas duplas, o arquivo primeiro é procurado primeiro na pasta atual, se não achar, vai procurar na pasta include criada na instalação do seu compilador.

Ex: #include "iostream"

Já se eu fizer uso dos sinais < > o compilador vai procurar o arquivo somente na pasta include

Ex: #include <iostream>

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pior que não existe explicação melhor.

Olhe que eu até procurei.

adicionado 15 minutos depois

Inclusive na norma n4659, 

26 minutos atrás, giu_d disse:

Nos projetos q criei até agora com o C++ usei o .h. Té rodei esse exercício do tópico agora mesmo e compilou tudo ok! 

Está comprovado o que eu disse:

35 minutos atrás, AnsiC disse:

C++ é assim mesmo, aceita tudo pode ser: *.hpp; *.cc, *.h e *.H;

 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Joanderson Pereira Aqui ficou assim os arquivos na pasta desse projeto após compilar o mesmo:

Capturar.PNG.c94c6b474ab3d7eee6d64a6371662e7c.PNG

 

Coloquei o nome de main mesmo p o arquivo onde está o método main

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda estou na batalha para rodar essa classe.

adicionei ao fig03_17 o #include "GradeBook.cpp", creio que resolveu os problemas de implementação de arquivos com o dev c++.

Porém a classe continua dando erro

[Error: redefition of "class of GradeBook"]

 

Mesmo salvando o Gradebook.h como header file mas continua sem rodar.

 

Percebi que ele estava salvo como arquivo C, então salvei ele com a extensão .hpp

Porém o mesmo erro persiste.

 

 

 

_________________________________________

 

 

 // Figura 3.17: fig03_17.cpp
 // Cria e manipula um objeto GradeBook; ilustra a validação.
 #include <iostream>
 using std::cout;  
 using std::endl;
 
 #include "GradeBook.cpp"
 #include "GradeBook.hpp" // inclui a definição de classe GradeBook
 
 // a função main inicia a execução do programa
 int main()
  {
    // cria dois objetos GradeBook;
    // nome inicial de curso de gradeBook1 é muito longo
        GradeBook gradeBook1( "CS101 Introduction to Programming in C++" );
        GradeBook gradeBook2( "CS102 C++ Data Structures" );
        
        // exibe courseName de cada GradeBook
        cout << "gradeBook1's initial course name is: "
        << gradeBook1.getCourseName()
        << "\ngradeBook2's initial course name is: "
        << gradeBook2.getCourseName() << endl;
        
    // modifica courseName do myGradeBook (com uma string de comprimento válido)
        gradeBook1.setCourseName( "CS101 C++ Programming" );
        
    // exibe courseName de cada GradeBook
        cout << "\ngradeBook1’s course name is: "
        << gradeBook1.getCourseName()
        << "\ngradeBook2's course name is: "
        << gradeBook2.getCourseName() << endl;
    return 0; // indica terminação bem-sucedida
  } // fim de main

 

 

___________________________________________________________

 

 

// Figura 3.16: GradeBook.cpp
 // Implementações das definições de função-membro de GradeBook.
 // A função setCourseName realiza a validação.
 #include <iostream>
 using std::cout;  
 using std::endl;
 
 #include "GradeBook.hpp" // inclui a definição de classe GradeBook
 
 // construtor inicializa courseName com String fornecido como argumento
 GradeBook::GradeBook( string name )
 
{
    setCourseName( name ); // valida e armazena courseName
} // fim do construtor GradeBook
// função que configura o nome do curso;  
// assegura que o nome do curso tenha no máximo 25 caracteres  
void GradeBook::setCourseName( string name )  
{  
    if ( name.length() <= 25 ) // se o nome tiver 25 ou menos caracteres  
           courseName = name; // armazena o nome do curso no objeto  
           
    if ( name.length() > 25 ) // se o nome tiver mais de 25 caracteres  
{         
    // configura courseName como os primeiros 25 caracteres do parâmetro name  
       courseName = name.substr( 0, 25 ); // inicia em 0, comprimento de 25  
       
       cout << "Name \"" << name << "\" exceeds maximum length (25).\n"  
       << "Limiting courseName to first 25 characters.\n" << endl;  
} // fim do if  
} // fim da função setCourseName

// função para obter o nome do curso
    string GradeBook::getCourseName()
{
    return courseName; // retorna courseName do objeto
} // fim da função getCourseName

// exibe uma mensagem de boas-vindas para o usuário GradeBook
    void GradeBook::displayMessage()
{
     // chama getCourseName para obter o courseName
         cout << "Welcome to the grade book for\n" << getCourseName()
        << "!" << endl;
} // fim da função displayMessage

 

 

_________________________________________________

 

 

// Figura 3.15: GradeBook.hpp  
// Definição de classe GradeBook apresenta a interface public da
// classe. Definições de função-membro aparecem em GradeBook.cpp.
#include <string> // o programa utiliza classe de string padrão do C++
using std::string;

// definição da classe GradeBook
class GradeBook
{
public:
   GradeBook( string ); // construtor que inicializa um objeto GradeBook
       void setCourseName( string ); // função que configura o nome do curso
       string getCourseName(); // função que obtém o nome do curso
       void displayMessage(); // função que exibe uma mensagem de boas-vindas
       
 private:
       string courseName; // nome do curso para esse GradeBook
}; // fim da classe GradeBook

 

_____________________________________

prove c++.png

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Joanderson Pereira Olá. Coloca o comando #pragma once no início do código do arquivo BradeBook.hpp, e altere de:

#include "GradeBook.h"
#include "GradeBook.cpp"

Mude para isso:

#include "GradeBook.hpp"
#include "GradeBook.cpp"

vou mandar o projeto completo novamente para ver se dá certo:

Arquivo GradeBook.hpp:

#pragma once

#include <string>
using namespace std;

class GradeBook
{
public:
    GradeBook(string);
    void setCourseName(string);
    string getCourseName();
    void displayMessage();
private:
    string courseName;
};

Arquivo GradeBook.cpp

#include "GradeBook.hpp"

#include <iostream>
using namespace std;

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

void GradeBook::setCourseName(string name)
{
    if (name.length() <= 25)
        courseName = name;

    if (name.length() > 25)
    {
        courseName = name.substr(0, 25);

        cout << "Name\"" << name << "\" exceeds maximum length (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 com o método main, pode ser fig03_17.cpp

#include <iostream>
using namespace std;

#include "GradeBook.hpp"
#include "GradeBook.cpp"

int main()
{
    GradeBook gradeBook1("CS101 Introduction to Programming in C++");
    GradeBook gradeBook2("CS102 Data structures in C++");

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

    gradeBook1.setCourseName("CS101 C++ Programming");

    cout << "\ngradeBook1's course name is: "
        << gradeBook1.getCourseName()
        << "\ngradeBook2's course name is: "
        << gradeBook2.getCourseName() << endl;

    cout << endl;

    system("pause");

    return 0;
}

Perceba q coloquei o comando #pragma once no início do arquivo GradeBook.hpp

Testa aí p ver se funciona. Coloca o arquivo onde tem o método main e aí tenta rodar

Qualquer coisa avisa, ok?

adicionado 23 minutos depois

@Joanderson Pereira Para resolver esse erro:

3 horas atrás, Joanderson Pereira disse:

[Error: redefition of "class of GradeBook"]

 

Basta colocar esse comando #pragma once  conforme o código acima

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Joanderson Pereira Olá. Segue um link com uma explicação a respeito da diretiva #pragma once

http://docwiki.embarcadero.com/RADStudio/XE3/en/Pragma_once

Aqui outra explicação:

https://pt.wikipedia.org/wiki/Pragma_once

 

Descrição:

" #pragma once é uma diretiva de pré-processamento usada para impedir que arquivos de cabeçalho sejam incluídos várias vezes. A #pragma once diretiva, uma vez presente em um arquivo, garante que o arquivo não será incluído várias vezes no projeto atual. Como resultado, nenhum erro é lançado."

 

Baseado ainda na pouca experiência q tenho com o C++, a questão é q o que estava acontecendo no seu projeto é que o arquivo de cabeçalho "GradeBook.hpp" estava sendo incluído duas vezes no seu projeto por meio da diretiva include, por isso resultava no erro q você mencionou. O arquivo de cabeçalho mencionado ser incluído duas vezes no mesmo projeto é o mesmo q incluir duas vezes o código todo desse arquivo no projeto.

A diretiva #pragma once corrige esse problema, impedindo que esse arquivo de cabeçalho seja incluído mais que uma vez em um mesmo projeto

 

OBS: Gostaria d t dar uma explicação melhor, mas devo confessar q o C++ inda não me é tão familiar, devido ao fato d eu estar estudando C somente

 

Mas, se ainda ficar dúvidas é só perguntar. Dentro do possível, vamos procurar responder, ok?

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema realmente está no compilador, eu reexecutei o código inicial e ele funcionou também, porém ao compilar "teclando f9" ele começa a demonstrar os mesmos erros de antes e se recusa a rodar o código novamente.

Estou usando o Dev C++, tem alguma maneira de o fazer ignora erros, ou algum outro compilador que ignore?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Joanderson Pereira Quando você tenta compilar o código coloca o arquivo com o método main aberto, que seria o arquivo fig03_17.cpp e tenta rodar o código a partir desse arquivo?

Os outros 2 arquivos nem mesmo precisam estar abertos no DevC++. A execução do código deve partir desse arquivo principal, com o método main, que seria o arquivo fig03_17.cpp

Testei agora no DevC++ e rodou normalmente

 

Capturar.PNG.376c519ae1eb1e8f3df9b66a29c45fef.PNG

 

Se funcionou uma vez, como você disse, o problema não está no compilador

Se der algum erro, por favor mencione qual erro é esse para facilitar na resposta

 

O código deve rodar independentemente da IDE. Aqui roda no CodeBlocks e DevC++

Mas eu recomendaria o uso do CodeBlocks ao invés do DevC++.

pode baixar nesse link:

http://www.codeblocks.org/downloads/26 (Use um dos links de download com MinGW incluso, por exemplo codeblocks-17.12mingw-setup.exe, senão vai pegar a IDE sem nenhum compilador.)

obs: esse comentário junto ao link peguei de uma postagem aqui de um colega do fórum

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Joanderson Pereira Olá. Peguei o seu código q foi postado acima e apenas colocando a diretiva #pragma once no início do arquivo GradeBook.hpp rodou tudo certo aqui no DevC++

Quem sabe pode ser o seu compilador mesmo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só a critério de curiosidades, se tive incluído a pasta do compilador nas variáveis do sistema (PATH do windows) basta usar a seguinte linha de comando no prompt:

 

C:\GradeBook>g++ fig03_17.cpp GradeBook.cpp -o GradeBook.exe

 

No geral quando cria uma Workspace ou um Projeto via IDE, ela faz essa reunião automaticamente, porém eu não uso IDEs logo reúno eu mesmos todos os arquivos-objetos (*.o *.c) em meus programinhas na linha de comando do g++ e "taco ENTER".

 

Por um instante me deu vontade de deixar isso bem claro, e ao mesmo que também uma outro solução para o problema.

 

Repetindo!! Os arquivos só são automaticamente reunidos quando se cria um Projeto ou  Workspace.

 

 

Dúvidas, perguntas ou críticas?

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, AnsiC disse:

Só a critério de curiosidades, se tive incluído a pasta do compilador nas variáveis do sistema (PATH do windows) basta usar a seguinte linha de comando no prompt:

 

C:\GradeBook>g++ fig03_17.cpp GradeBook.cpp -o GradeBook.exe

 

No geral quando se cria uma Workspace ou Projeto via IDE, ela faz essa reunião automaticamente, porém eu não uso IDEs por isso reúno eu mesmos todos os arquivos-objetos (*.o *.c) de meus programinhas na por linha de comando do g++ e "taco ENTER".

 

Por um instante me deu vontade de deixar isso bem claro, e ao mesmo que também uma outro solução para o problema.

 

Repetindo!! Os arquivos só são automaticamente reunidos quando se cria um Projeto ou  Workspace.

 

 

Dúvidas, perguntas ou críticas?

 

Usando o Gbd online, o código inicial (o primeiro lá de cima com #pragma once) roda perfeitamente, no Dev C++ os arquivos não estavam reunidos em um projeto, quando eu os reuni não houve problemas com implementação, a compilação aponta 0 erros.

Porém não consigo executar o projeto no Dev C++, vou no arquivo que possui a função main (fig03_17.cpp) clico em executar (F10) e nada acontece. Esse agora é um simples problema de uso da plataforma, pode responder como devo proceder?

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Joanderson Pereira

44 minutos atrás, Joanderson Pereira disse:

clico em executar (F10) e nada acontece

Experimenta F11 (compilar e executar) como mostrado na figura acima

Primeiro você precisa compilar o projeto para depois executar

Aqui o q costumo fazer é criar uma pasta e dentro dessa pasta colocar os arquivos do projeto (.hpp, .cpp) e funciona tudo ok.

Até agora não tive nenhum problema fazendo assim, mesmo com projetos com uns 10 arquivos. E isso no DevC++

Sem precisar criar um "novo projeto", para q os arquivos sejam automaticamente reunidos

Já no Visual Studio e como também já fiz no CodeBlocks, dependendo da quantidade de arquivos, costumo criar um novo projeto

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentem não usando o arquivo de cabeçario, use importar apenas o de implementação: ou seja dentro do arquivo fig03_17 incluam somente:

GradeBook.cpp

 

Invés disso

#include "GradeBook.hpp"
#include "GradeBook.cpp"

Isso

#include "GradeBook.cpp"

Tenho 99% de certeza que vai compilar

adicionado 1 minuto depois

sendo que fig03_17 e GradeBook estão na mesma pasta.

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@AnsiC 

11 minutos atrás, AnsiC disse:

Isso


#include "GradeBook.cpp"

 

Sim. Testei agora mesmo e tudo certo, compilou conforme você disse. Obrigado por mais essa!

Até onde sei esse processo de unir os arquivos seria linkeditar, estou certo?

Isso me referindo ao C, não sei se no C++ seria isso

Explicação:

"Linkedição ( ou linking em inglês): Um programa em linguagem C traz referências a funções que se encontram nas bibliotecas padrão ou, em muitos casos , faz referências a bibliotecas privadas definidas pelos programadores do projeto. As bibliotecas, ou arquivos de cabeçalho, tem a extensão .h O linker tem por objetivo juntar esse código em um local e gerar um único arquivo executável. Caso ocorra algum erro no processo de linkedição, retorna-se ao código fonte para identificar e corrigir o erro e depois, compilar e linkar novamente o código. Se não ocorrer erro, então o processo prossegue até gerar o programa executável."

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, Joanderson Pereira disse:

Porém não consigo executar o projeto no Dev C++, vou no arquivo que possui a função main (fig03_17.cpp) clico em executar (F10) e nada acontece. Esse agora é um simples problema de uso da plataforma, pode responder como devo proceder?

Sei não, não uso IDEs, em geral meus códigos são pequenos usar IDE seria como matar uma formiga de canhão.

adicionado 2 minutos depois
12 minutos atrás, giu_d disse:

Obrigado por mais essa!

:thumbsup:!

adicionado 12 minutos depois
19 minutos atrás, giu_d disse:

Um programa em linguagem C traz referências a funções que se encontram nas bibliotecas padrão

É somente para os padrões. C e C++, os arquivos estão distribuídos no diretório lib.

adicionado 16 minutos depois

Eu acredito que as IDEs não estejam movendo prescrições do padrão, e sim fazendo o mesmo que eu faço: colando cada arquivo na chamada do programa g++.exe

Se houver um relatório de build provavelmente poderá ver isso lá; 

adicionado 21 minutos depois

Já a biblioteca estática, essa é de domínio automático do compilador, é lá que se encontra os arquivos-fontes (*.o) de todas as coisas que vêm "implementado de fabrica".

adicionado 24 minutos depois

***Nome certo é Arquivos-Objetos (*.o)

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
6 horas atrás, AnsiC disse:

Tentem não usando o arquivo de cabeçario, use importar apenas o de implementação: ou seja dentro do arquivo fig03_17 incluam somente:

GradeBook.cpp

 

Invés disso


#include "GradeBook.hpp"
#include "GradeBook.cpp"

Isso


#include "GradeBook.cpp"

Tenho 99% de certeza que vai compilar

adicionado 1 minuto depois

sendo que fig03_17 e GradeBook estão na mesma pasta.

Se linkar o GradeBook.cpp (em qualquer um dos casos) o arquivo de cabeçalho perde o sentido, isso tudo é justamente para que o cliente possa utilizar das funções-membros de GradeBook sem saber como são implementadas.

 

O Dev está apenas compilando, clico em Executar ou Compilar e Executar, mas nada acontece.

 

Quando tentei compilar incluindo suas modificações o GradeBook.cpp provavelmente não carregou o GradeBook.hpp e tive que adicionar #include <string> using namespace std; a ele. Agora aparece esta mensagem de erro quando tento compilar/executar o arquivo.

 

 

prove c++.png

prove c++.png

Compartilhar este post


Link para o post
Compartilhar em outros sites
8 horas atrás, Joanderson Pereira disse:

no Dev C++ os arquivos não estavam reunidos em um projeto, quando eu os reuni não houve problemas com implementação, a compilação aponta 0 erros.

Volte para essa configuração, quando não deu nada errado. Se quiser executar o programa vá na pasta do projeto clique diretamente nele.

adicionado 51 minutos depois

Estou instalando o Dev-C++ agora quero ver do que se trata.

  • 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

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 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

×