Creazione di istanze a livello globale (C ++)
-
06-07-2019 - |
Domanda
Ottengo il seguente errore con il codice seguente.
expected constructor, destructor, or type conversion before '=' token
-
#include <string>
#include <map>
class Foo {
};
std::map<std::string, Foo> map;
map["bar"] = Foo();
int main()
{
return 0;
}
Soluzione
map["bar"] = Foo(); // This line is a statement not a declaration.
// You have to put it in main, or any execution context
Fino a quando C ++ 0x diventa mainstream, suggerirei di usare boost
. Riempire la map
diventa un gioco da ragazzi. Ecco un esempio:
std::map<std::string, Foo> mymap;
...
int main()
{
insert(mymap)
("First", Foo(...))
("Second", Foo(...))
("Third", Foo(...));
...
}
Altri suggerimenti
La risposta breve, come hai visto, è: non puoi farlo.
Penso che quello che vuoi davvero sia questo:
std::map<std::string, Foo> map;
int main()
{
map["bar"] = Foo();
Se veramente è necessario eseguire l'inizializzazione prima di main ()
vedrai spesso esempi come questo:
namespace {
struct StaticInitHelper {
StaticInitHelper() { map["bar"] = Foo(); }
} _helper_obj;
}
Tuttavia, ora hai un nuovo problema, ovvero che non esiste alcuna garanzia che map
venga creato prima di _helper_obj
. Un modo per aggirare questo è combinarli:
namespace {
struct StaticInitHelper : public std::map<std::string, Foo> {
StaticInitHelper() { (*this)["bar"] = Foo(); }
} map;
}
Tuttavia, l'ereditarietà dalle classi di contenitori STL non è generalmente consigliata. Si noti che questo esempio nasconde altri costruttori e la classe di base STL non ha un distruttore virtuale. Questo sarebbe considerato un "hack". da molti, e dovrebbe davvero essere evitato.
Un'altra alternativa è definire la classe con un std :: map
:
namespace {
struct StaticInitHelper {
StaticInitHelper() { map["bar"] = Foo(); }
std::map<std::string, Foo> map;
} map_holder;
}
map_holder.map.find(...
Ma ovviamente questo complica qualsiasi uso della mappa.
Aggiornamento:
Ho dimenticato di menzionare un'altra opzione, usando boost :: Assegna
:
#include <boost/assign/list_of.hpp>
map<int,int> map = boost::assign::map_list_of(1,2)(2,3)(3,4)(4,5)(5,6);
Tuttavia, non riesco a trovare informazioni sulla sicurezza di un oggetto statico.
Sembra che quello che vuoi sia un inizializzatore statico. Ti suggerisco di leggere questo . Illustra l'uso di inizializzatori statici e anche del loro errore principale, l'ordine di inizializzazione statica.