Q:

How can i choose just one object?

Hi I have created two dictionaries with a different implementation (Red Black Trees and Hash Table)
I have to create just one object of my dictionary named istanza_vocabolario.
Inside main I use for example istanza_vocabolario->Cancella(parola_new)
According to my choose, istanza_vocabolario has to be VocabolarioRB* type or Vocabolario* .
I can't create a function because I can't know if I have to return a Vocabolario pointer or VocabolarioRB pointer. If I declare the object into the IF, then occurs scope errors.
How can I do?
Sorry for bad English, thank you!
#include "abstract_Vocabolario.h"
#include "abstract_Vocabolario.cpp"

#include "VocabolarioRB.h"
#include "Vocabolario.h"
#include "Vocabolario.cpp"

using namespace std;

char Menu();

int main()
{

         VocabolarioRB* istanza_vocabolario = new VocabolarioRB;

        int scelta_vocabolario;
        cout<<"Quale vocabolario vuoi utilizzare (1 per RedBlack o 2 per HashTable) ?"<<endl;
        cin>>scelta_vocabolario;

        if (scelta_vocabolario == 2 )
        {
            delete istanza_vocabolario;
            Vocabolario* istanza_vocabolario = new Vocabolario;
        }

        while(true)
        {
            char scelta=Menu();
            switch(scelta)
            {
            case '1':
                    {
                    cout<<" 1)Inserimento parola"<<endl;
                    string parola_new;
                    cout<<endl<<" Inserisci parola da immettere nel vocabolario:\n ";
                    cin>>parola_new;
                    if (istanza_vocabolario->Inserisci(parola_new) != 0 )
                        cout << "Inserito con successo" << endl;
                    else
                        cout << "Inserimento non avvenuto" << endl;
                    }
                    break;
            case '2':
                {
                cout<<" 3)Ricerca parola"<<endl;
                string parola_ricercata;
                cout<<endl<<" Inserisci parola da RICERCARE nel vocabolario:\n ";
                cin>>parola_ricercata;
                istanza_vocabolario->Ricerca(parola_ricercata);
                }
                break;

            //case '3':
                //istanza_vocabolario->Visita_Albero();       //MOMENTANEAMENTE VALE SOLO PER IL DIZIONARIO 2
                //break;

            case '4':

                {
                cout<<" 4)Eliminazione parola"<<endl;
                string parola_new;
                cout<<endl<<" Inserisci parola da eliminare nel vocabolario: ";
                cin>>parola_new;
                if (istanza_vocabolario->Cancella(parola_new) != 0)
                    cout<< "Eliminato con successo" << endl;
                else
                cout <<"Eliminazione NON avvenuta" << endl;
                }

                break;

            case 'E':
                delete istanza_vocabolario;
                return 0;

            default:
                cout<<" ATTENZIONE";
                cout<<" valore inserito non valido."<<endl;
            }
        }

return 0;
}

char Menu()
{
    cout<<endl<<endl<<" Menu Vocabolario"<<endl<<endl;;
    cout<<" Scegli l'operazione da compiere:"<<endl<<endl;
    cout<<" 1";
    cout<<" - Inserisci nuova parola;"<<endl;
    cout<<" 2";
    cout<<" - Ricerca parola;"<<endl;
    cout<<" 3";
    cout<<" - Visualizza albero;"<<endl;
    cout<<" 4";
    cout<<" - Elimina parola;"<<endl;
    cout<<" E";
    cout<<" - Esci dal programma."<<endl<<" ";;
    cout<<endl<<" Digita il numero dell'operazione: ";
    char valore;
    cin>>valore;
    cout<<endl;
    return valore;
}

A:

This is what interfaces are for!
Do this:

Declare an abstract class called Vocabulario
Make VocabolarioRB inherit from Vocabulario
Make VocabolarioHT inherit from Vocabulario
(this is what you're calling Vocabulario at the moment)

Each of these types should have the same member functions. Then, in your main, it doesn't really matter which implementation you've chosen, because you just call the functions you need through a Vocabulario* pointer.
const bool use_hash = false;
std::unique_ptr<Vocabulario> ptr(
   use_hash
   ? new VocabularioRB()
   : new VocabularioHT()
);

ptr->foo();
ptr->bar();

