Ir ao conteúdo
  • Cadastre-se
Joanderson Pereira

C++ RESOLVIDO C++ Adicionando parâmetros e funções-membros à uma classe

Posts recomendados

Aqui temos a classe GradeBook.

1- Ela possui a string courseName e as funções-membros setCourseName, getCourseName e displayMessage (que permitem, respectivamente, configurar o nome do curso, obter o nome do curso e exibir uma mensagem de boas-vindas).

2- O objetivo é criar a string courseTutor e as funções-membros setCourseTutor, getCourseTutor (que permitem configurar o nome do instrutor e obter o nome do instrutor). E isso dentro da mesma classe GradeBook.

Com certeza tem muitos erros no código em relação a declaração de parâmetros e algumas outras coisas, sinceramente já não tenho mais cabeça para isso.

O código da maneira que está agora apresenta basicamente os seguintes erros:

 

‘getCourseTutor’ was not declared in this scope                                                    */ isso para quase
class ‘GradeBook’ does not have any field named ‘courseTutor’                                  todas as
‘std::string GradeBook::courseTutor’ conflicts with a previous declaration                      funções-membros \*

O código estava funcionando apenas com as funções 1.

Tentei adicionar as funções 2 seguindo o mesmo padrão e não deu muito certo.

E aí está a criança:


// 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, string tutor )
    : courseName( name ), courseTutor( tutor )
 {
 setCourseName( name ); // valida e armazena courseName
 setCourseTutor( tutor );
 } // 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


 // função que configura o nome do instrutor;
 
 // assegura que o nome do curso tenha no máximo 25 caracteres
 void GradeBook::setCourseTutor( string tutor )
 {
 if ( tutor.length() <= 25 ) // se o nome tiver 25 ou menos caracteres
 courseName = name; // armazena o nome do curso no objeto

 if ( tutor.length() > 25 ) // se o nome tiver mais de 25 caracteres
 {
 // configura courseTutor como os primeiros 25 caracteres do parâmetro name
 courseTutor = tutor.substr( 0, 25 ); // inicia em 0, comprimento de 25

 cout << "Name \'" << tutor << "\" exceeds maximum length (25).\n"
 << "Limiting courseName to first 25 characters.\n" << endl;
 } // fim do if
 } // fim da função setCourseTutor
 
  // função para obter o nome do instrutor
 string GradeBook::getCourseTutor()
 {
 return courseTutor; // retorna courseTutor do objeto
 } // fim da função getCourseTutor

// 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;
    // exibe uma mensagem de boas-vindas para o usuário GradeBook
    
 
 // chama getCourseTutor para obter o courseTutor
 cout << "This course is presented by: "<< getCourseTutor()
 << "!" << 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 name, string tutor ); // construtor que inicializa um objeto GradeBook
  : courseName( name ), courseTutor( tutor )
 void setCourseName( courseName ); // função que configura o nome do curso
 string getCourseName(); // função que obtém o nome do curso
 void setCourseTutor ( courseTutor );
 string getCouseTutor ();
 void displayMessage(); // função que exibe uma mensagem de boas-vindas
 private:
 string courseName; // nome do curso para esse GradeBook
 string courseTutor;
 }; // fim da classe GradeBook


// Figura 3.17: main.cpp

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

 #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

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Joanderson Pereira Olá. Ótima essa sua atitude de fazer a implementação desse projeto. Parabéns!

Porém, não ficou clara qual é a sua dúvida :confused:

Logo de cara já se percebe que você definiu o Construtor da classe para receber dois parâmetros. Só que você está criando os objetos passando apenas um parâmetro, que é o nome do curso (!?)

Teria que ou mudar o Construtor para receber só um parâmetro ou passar dois parâmetros ao criar um novo objeto da classe

 

Mais alguma dúvida?

 

O código está rodando aí?

 

Classe GradeBook.hpp:

// Definição de classe GradeBook apresenta a interface public da
// classe. Definições de função-membro aparecem em GradeBook.cpp.
#pragma once

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

class GradeBook
{
public:
    GradeBook();
    GradeBook( string name, string tutor);
    void setCourseTutor( string tutor );
    void setCourseName( string name );
    string getCourseName();
    string getCourseTutor();
    void displayMessage();
private:
    string courseName;
    string courseTutor;
    string name;
    string tutor;
};

Classe GradeBook.cpp:

// Implementações das definições de função-membro de GradeBook.
#include <iostream>
#include <string>
using namespace std;

#include "GradeBook.hpp" // inclui a definição de classe GradeBook

GradeBook::GradeBook() {

}


GradeBook::GradeBook( string name, string tutor )
    : courseName( name ), courseTutor (tutor)
{
    setCourseName( name );
    setCourseTutor( tutor );
}

void GradeBook::setCourseName( string name )
{
    if ( name.length() <= 15 )
        this->courseName = name;

    if ( name.length() > 15 )
    {

        this->courseName = name.substr( 0, 15 );

        cout << "Name " << name << " exceds maximum length (15).\n"
             << "Limiting courseName to first 15 characters.\n" << endl;
    }
}

string GradeBook::getCourseName()
{
    return this->courseName;
}

void GradeBook::setCourseTutor( string tutor )
{
    if ( tutor.length() <= 15 )
        this->courseTutor = tutor;

    if ( tutor.length() > 15 )
    {
        this->courseTutor = tutor.substr( 0, 15 );

        cout << endl;

        cout << "Name \"" << tutor << "\" exceds maximum length 15.\n"
             << "Limiting courseName to first 15 characters.\n" << endl;
    }
}

string GradeBook::getCourseTutor()
{
    return courseTutor;
}

void GradeBook::displayMessage()
{
    // chama getCourseName para obter o courseName
    cout << "Welcome to the grade book for\n" << getCourseName()
         << "!" << endl;

    cout << "This course is presented by: "<< getCourseTutor()
         << "!" << endl;

    cout << endl;

}

Classe Main.cpp:

// Cria e manipula um objeto GradeBook; ilustra a validação.
#include <iostream>
using namespace std;

#include "GradeBook.hpp" // inclui a definição de classe GradeBook
#include "GradeBook.cpp"

int main()
{

    GradeBook *gradeBook1 = new GradeBook("CS101 Introduction in C++", "Tutor 1");
    GradeBook *gradeBook2 = new GradeBook("CS102 C++ Structures", "Tutor 2");

    gradeBook1->displayMessage();
    gradeBook2->displayMessage();

    cout << "gradeBook1's initial course name is: "
         << gradeBook1->getCourseName()
         << "\ngradeBook2's initial course name is: "
         << gradeBook2->getCourseName() << endl;

    cout << endl;

    gradeBook1->setCourseName( "CS101 C++ Programming" );

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

    delete gradeBook1;

    delete gradeBook2;

    return 0;
}

Perceba que para criar um novo objeto se usa o operador new

Dá para fazer como você vem fazendo, mas vejo ser necessário saber a respeito de como criar um novo objeto de uma classe 

 

OBS: Código atualizado agora

Vê se é isso que você quer, ok?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe a demora, agradeço a ajuda, fiquei tão preocupado em adiciona novos parâmetros que esqueci de chama-los na função main, o código foi bastante explicador para mim, gostaria de pedir explicações sobre o uso de "->" ao invés do "."  e sobre a declaração do construtor no reader.

 

O código não rodou no Dev c++  apresentando o erro :C:\Users\Gatão\Documents\collect2.exe    [Error] ld returned 1 exit status

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Joanderson Pereira Olá. A respeito dessa dúvida:

Em 04/10/2018 às 10:32, Joanderson Pereira disse:

gostaria de pedir explicações sobre o uso de "->" ao invés do "."

 

Essa questão diz respeito a como você está criando um novo objeto

Da forma como estou fazendo estou usando o operador new e de fato criando um novo objeto, logo, nesse caso, é preciso fazer uso das setas e não do ponto

Veja a diferença:

GradeBook *gradeBook1 = new GradeBook("CS101 Introduction in C++", "Tutor 1"); // fazendo uso do operador new

Agora veja como você está "criando" um novo objeto da classe GradeBook:

GradeBook gradeBook1( "CS101 Introduction to Programming in C++" );

Percebe a diferença? É por isso o operador '->' e não o '.'

Em orientação a objetos, somente fazendo uso do operador new a gente está, de fato, criando um novo objeto e alocando o mesmo no HEAP, por isso após fazer uso desse objeto é preciso remover o mesmo da memória (Heap) com o comando delete

 

quanto ao erro no DevC++ aqui tá dando um bug bem estranho de rodar outro projeto ao invés desse

É obrigatório o uso do DevC++? Recomendo o Code Blocks, tanto porque o DevC++ está sem receber atualizações já há uns 10 anos (defasado)

Veja o resultado do código no Code Blocks:

Capturar.PNG.df2229284740e5b40b2bbcf91557795f.PNG

 

Apenas para teste limitei os nomes de cursos e tutores para 15

Experimenta o Code Blocks, tenho certeza q vai gostar!

Qualquer dúvida é só perguntar, ok?

 

Atualizando:

Segue a pasta compactada com os código tais como foram postados acima. Testa e vê se tá tudo ok

Projeto GradeBook.zip

Té agora não consegui resolver esse bug no DevC++ 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Passei a usar o eclipse e o código rodou de boas.

Fiz as alterações que precisava no main e no GradeBook.cpp, praticamente courseTutor é courseName com outro nome.

Agradeço por ter sanado minhas dúvidas. Que Jesus esteja com você.

 

Main

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

 #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 = new GradeBook( "CS101 Introduction to Programming in C++", "Matheo Ruan" );
    GradeBook *gradeBook2 = new GradeBook( "CS102 C++ Data Structures","Michelangelo Lindo" );

    gradeBook1->displayMessage();
    gradeBook2->displayMessage();

    // exibe courseName de cada GradeBook
    cout << "\ngradeBook1's initial course name is:"
    << gradeBook1->getCourseName()
    << "\ngradeBook2's initial course name is: "
    << gradeBook2->getCourseName()

    << "\ngradeBook1's initial tutor name is: "
    << gradeBook1->getCourseTutor()
    << "\ngradeBook2's initial tutor name is: "
    << gradeBook2->getCourseTutor() << endl;

    // modifica courseName do myGradeBook (com uma string de comprimento válido)
    gradeBook1->setCourseName( "CS101 C++ Programming" );
    gradeBook2->setCourseTutor( "Michelangelo");

    // exibe courseName de cada GradeBook
    cout << "\ngradeBook1's course name is: "
    << gradeBook1->getCourseName()
    << "\n This course is present by: "
    << gradeBook1->getCourseTutor()
    << "\ngradeBook2's course name is: "
    << gradeBook2->getCourseName()
    << "\n This course is present by: "
    << gradeBook2->getCourseTutor()
    << endl;

    delete gradeBook1;
    delete gradeBook2;
    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>
 #include <string>
 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()
     {
  }
    GradeBook::GradeBook ( string name, string tutor ) // fim do construtor GradeBook
       : courseName (name), courseTutor (tutor)
    {
        setCourseName (name);
        setCourseTutor (tutor);
    }
 // 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
    this->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
    this->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 this->courseName; // retorna courseName do objeto
 } // fim da função getCourseName

 void GradeBook::setCourseTutor (string tutor)
 {
     if (tutor.length() <= 15 )
         this->courseTutor = tutor;


    if (tutor.length() > 15 )
    {
        this->courseTutor = tutor.substr(0 , 15);

        cout << endl;

        cout << "Name \"" << tutor << "\" exceeds maximum length 15.\n"
        << "Limiting courseTutor to first 15 characters. \n" << endl;
    }
 }
 string GradeBook::getCourseTutor()
 {
     return courseTutor;
 }

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


 // chama getCourseTutor para obter o courseTutor
 cout << "This course is presented by: "<< getCourseTutor()
 << "!" << 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.
 #pragma once
 #include <string> // o programa utiliza classe de string padrão do C++
 using std::string;

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

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Junte-se à conversa

Você pode postar agora e cadastrar-se depois. Se você tem uma conta, faça o login para postar.

Visitante
Responder

×   Você colou conteúdo com formatação.   Restore formatting

  Só é possível ter até 75 emoticons.

×   O link foi automaticamente convertido para mostrar o conteúdo.   Clique aqui para mostrá-lo como link comum

×   Seu texto anterior foi restaurado.   Limpar o editor

×   You cannot paste images directly. Upload or insert images from URL.






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

×
×
  • Criar novo...

GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!