Ir ao conteúdo
  • Cadastre-se
Joanderson Pereira

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

Recommended Posts

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

 

  • Obrigado 1

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

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

×