Use the class to add the object itself into a vector that stays in another object

Asked

Viewed 44 times

-1

In python I made the following code:

class Escola:
    def __init__( self, escola_nome ):
        self.escola_nome = escola_nome
        self.alunos = []
    
    
class Aluno:
    def __init__( self, nome ):
        self.nome = nome
        self.escola = None
    
    def matricular( self, escola ):
        if not self.escola:
            escola.alunos.append( self )
            self.escola = escola
            print( f'{self.nome} se matriculou na escola {self.escola.escola_nome}' )
        
        else:
            print( f'{self.nome} já está matriculado na escola {self.escola.escola_nome}' )


estadual = Escola( "Alguma escola aqui" )

alguem = Aluno( "lucas" )
alguem.matricular( estadual )

print( f"Escola de Lucas: {alguem.escola.escola_nome}" )

In the above code the "matricular" method adds the object being used in a list that is in another class.

I tried to do this same exercise in C++, I’m having difficulty getting the class to add its own object in a vector that stays in the other class and I’m also having some other problems.

The code went like this:

#include <iostream> // std::cout
#include <vector> // std::vector


struct Escola
{
    Escola( std::string school_name="" ): nome_escola( school_name ) {}
    
    std :: string nome_escola;
    std :: vector< Aluno > estudantes; // Erro: o struct "Aluno" não existe
};


struct Aluno
{
    Aluno( std::string name ): nome( name ) {}
    void matricular( Escola& school );
    // se colocasse o struct "Aluno" antes do struct "Escola" também haveria erro
    // pois o struct "Escola" ainda não estaria definido seria preciso usá-lo aqui
    
    std :: string nome;
    Escola escola;
};


void Aluno :: matricular( Escola& school )
{
    //if( escola != NULL ) não sei verificar se um objeto está vazio. dessa maneira não funcionou
    school.estudantes.push_back( /*Aqui deveria ser adicionado o objeto que está usando o método "matricular". não sei como faz isso em C++*/ );
    escola = school;
}


int main( void )
{
    Escola estadual = Escola( "Algum nome de escola aqui" );
    Aluno inteligente = Aluno( "João" );
    
    inteligente.matricular( estadual );
    
    std :: cout << inteligente.escola.nome_escola << "\n";
    
    
    return 0;
}

2 answers

-1

The code is, in fact, somewhat confused and I believe that the arfnet recommendation is excellent... the matricular should be an attribute of the school.

In an excerpt of your code you use "school.alunos.append()", without even starting the School in the Students class, or assigned to the self.school from the students class to School (perhaps the latter is a reversal in the code, as shown below).

def __init__( self, nome ):
    self.nome = nome
    self.escola = None

def matricular( self, escola ):
    if not self.escola:
        escola.alunos.append( self )  **tentativa do append**
        self.escola = escola **mas a 'iniciação' da escola ocorreu depois, portanto não havia lista existente**

After my changes I would return the following code:

class Escola:
    def __init__(self, escola):
        self.escola_nome = escola
        self.alunos = []

    def matricular(self, aluno):
        if aluno.nome in self.alunos:
            print(f'{aluno.nome} já está matriculado na escola {self.escola_nome}')
        else:
            self.alunos.append(aluno.nome)
            print(f'{aluno.nome} se matriculou na escola {self.escola_nome}')
            aluno.escola = self.escola_nome

class Aluno:
    def __init__(self, nome):
        self.nome = nome
        self.escola = None

The test would be:

if __name__ == '__main__': **Quando estiver programando em POO isso é uma boa prática**
    estadual = Escola("Alguma escola aqui")

    alguem = Aluno("lucas")
    estadual.matricular(alguem)

    print(f"Escola de Lucas: {alguem.escola}")
    print(f"Lista de alunos matriculados: {estadual.alunos}")

-1


I tried to do this same exercise in C++, I’m having difficulty getting the class to add its own object in a vector that stays in the other class and I’m also having some other problems.

This data composition seems strange in English, or Python or C. Maybe it’s more natural matricular() be a method of Escola and not of Aluno. Anyway a cyclic reference exists.

A simple example

int main(void)
{
    Escola estadual = Escola("Alguma Escola");
    estadual.lista_os_caras("Sem alunos ainda");

    Aluno inteligente = Aluno("Joao");
    Aluno um          = Aluno("Jhonny");
    estadual.matricular(inteligente);
    estadual.matricular(um);

    estadual.lista_os_caras("Com alunos");
    return 0;
}

showcase

Sem alunos ainda
0 matriculados em "Alguma Escola"
    matricular()    Joao matriculado em "Alguma Escola"
    matricular()    Jhonny matriculado em "Alguma Escola"
Com alunos
2 matriculados em "Alguma Escola"
Joao
Jhonny

the whole program

#include <iostream>
#include <vector>
using namespace std;

struct Aluno
{
    Aluno(std::string name) : nome(name), escola("Sem Matricula") {}
    string nome;
    string escola;
};

struct Escola
{
    Escola() : Escola(""){};
    Escola(string school_name = "") : nome_escola(school_name){};

    std ::string        nome_escola;
    std ::vector<Aluno> estudantes;

    void lista_os_caras(const char*);
    void matricular(Aluno&);
};
int main(void)
{
    Escola estadual = Escola("Alguma Escola");
    estadual.lista_os_caras("Sem alunos ainda");

    Aluno inteligente = Aluno("Joao");
    Aluno um          = Aluno("Jhonny");
    estadual.matricular(inteligente);
    estadual.matricular(um);

    estadual.lista_os_caras("Com alunos");
    return 0;
}


void Escola::lista_os_caras(const char* tit)
{
    if (tit != nullptr) cout << tit << "\n";

    cout << estudantes.size() << " matriculados em \"" << nome_escola
         << "\"\n";
    for (auto a : estudantes) cout << a.nome << "\n";
}


void Escola::matricular(Aluno& aluno)
{
    aluno.escola = nome_escola;
    estudantes.push_back(aluno);
    cout << "    matricular()    " << 
        aluno.nome << " matriculado em \"" <<
        aluno.escola << "\"\n";
}

Compare and maybe help something.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.