How to use vector to store a class?

6

Example:

 class Nome
    {private:
             string nome;
        public:
            Nome(string nome);
            virtual void exibirNome() =0;

    };
class SobreNome: public Nome
    {private:
             string nome;
        public:
            SobreNome(string nome, string sobre_nome): Nome(nome) ;

            void exibirNome();

    };

No main

vector<Nome> *nome;
 Nome *n  = new SobreNome("João", "Alves");
nome->push_back(n);

So I can not do this.

  

error: can not allocate an object of abstract type 'Name'

What is the right way?

    
asked by anonymous 27.03.2016 / 18:20

2 answers

5

The code has some problems, I will not fix everything, but I will allow at least it to be compiled:

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

class Nome {
    protected:
        string nome;
    public:
        Nome(string _nome) {
            nome = _nome;
        }
        virtual void exibirNome() = 0;
};
class SobreNome : public Nome {
    string sobre_nome;
    public:
        SobreNome(string nome, string _sobre_nome) : Nome(nome) {
            sobre_nome = _sobre_nome;
        }
        void exibirNome() {
            cout << nome << " " << sobre_nome;
        }
};

int main() {
    vector<Nome*> *nome = new vector<Nome*>;
    Nome *n = new SobreNome("João", "Alves");
    nome->push_back(n);
    nome->at(0)->exibirNome();
    return 0;
}

See working on ideone .

To use access by the index operator you have to do this:

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

class Nome {
    protected:
        string nome;
    public:
        Nome(string _nome) {
            nome = _nome;
        }
        virtual void exibirNome() = 0;
};
class SobreNome : public Nome {
    string sobre_nome;
    public:
        SobreNome(string nome, string _sobre_nome) : Nome(nome) {
            sobre_nome = _sobre_nome;
        }
        void exibirNome() {
            cout << nome << " " << sobre_nome;
        }
};

int main() {
    vector<Nome*> nome;
    Nome *n = new SobreNome("João", "Alves");
    nome.push_back(n);
    nome[0]->exibirNome();
    return 0;
}

See working on ideone .

It's not time yet, but look for smart pointers instead of raw pointers . This code is simple and does not generate damage, but in real code this would leak memory. C ++ is not Java, you have to manage memory.

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

class Nome {
    protected:
        string nome;
    public:
        Nome(string _nome) {
            nome = _nome;
        }
        virtual void exibirNome() = 0;
};
class SobreNome : public Nome {
    string sobre_nome;
    public:
        SobreNome(string nome, string _sobre_nome) : Nome(nome) {
            sobre_nome = _sobre_nome;
        }
        void exibirNome() {
            cout << nome << " " << sobre_nome;
        }
};

int main() {
    vector<unique_ptr<Nome>> nome;
    nome.emplace_back(new SobreNome("João", "Alves"));
    nome[0]->exibirNome();
    return 0;
}

See working on ideone .

    
27.03.2016 / 19:35
2

You are assigning the class to your vector pointer, so you will not have a vector but a class allocated to the pointer. You should create the pointer instance first.

class C{
    C(){
        std::cout << "instanciada" << std::endl;
    }
};

using namespace std;

int main(){
    vector<C> class_vec; // cria um vetor de classes C
    C my_class;
    class_vec.push_back(my_class); // adiciona a classe na lista

    my_class = class_vec[0]; // retorna a primeira classe inserida na lista
}

You can also do the process using pointers:

#include <vector>

class C{};

using namespace std;

int main(){
    vector<C*> *class_vec = new vector<C*>(); // cria um vetor de classes C
    C *my_class = new C();
    class_vec->push_back(my_class); // adiciona a classe na lista

}
    
27.03.2016 / 18:58