[cpp]inicjalizacja statyczej std::map'y

0

siemka,
oto pliki:

//zlo.h
#include <map>
#include <string>
class test
{

public:
static std::map<int,std::string> lista;

};


//zlo.cpp
#include "zlo.h"

std::map<int,std::string> test::lista;
test::lista[12]="deef";//error ;/
[BCC32 Error] zlo.cpp(11): E2356 Type mismatch in redeclaration of 'zlo::lista'
[BCC32 Error] zlo.h(16): E2344 Earlier declaration of 'zlo::lista'

Jak widac powyzej problem jest z inicjalizacja tej mapy.Moze ktos jest wstanie mi powiedziec dlaczego ?

0

dlatego, ze na 'scopie pliku' mozesz jedynie definiowac namespace'y/klasy/funkcje/POLA i je INICJALIZOWAC, natomiast te dwie linijki ktore zamiesciles robia wiecej:

  • linia static std::map<int,std::string> lista definiuje zmienna statyczna
  • linia std::map<> test::lista inicjalizuje ja konstruktorem domyslnym
  • linia test::lista[12]="deef" probuje WYWOLAC metode operator[int] z argumentem 12 na owym stdmap i na wyniku tej meotdy WYWOLAC operator=(string) z argumentem "deef"

nie_da_sie "wykonywac kodu" na 'scopie pliku' i kropka.

mozna natomiast wykorzystac wszystkie dobra inicjalizacji, przemysl to:

//zlo.h
#include <map>
#include <string>

class test
{
public:
    static std::map<int,std::string> lista;
};
//zlo.cpp
#include "zlo.h"

using namespace std;

struct test_lista_initializer : public map<int, string>
{
    test_lista_initializer()
    {
        this[12] = "deef";
    }
}

map<int, string> test::lista ( test_lista_initializer() ); //inicjalizacja przez copy-ctor
0

nie_da_sie "wykonywac kodu" na 'scopie pliku' i kropka.

Na dobrą sprawę wężu, to da się na chama, właśnie wykorzystując dobra inicjalizacji ;) Tutaj, przy inicjalizacji mapy idzie przez konstruktor kopiujący - stworzyłeś dodatkową klasę. Można stworzyć dodatkową funkcję, jeśli zachodzi konieczność wykonania jakowychś bardziej zamotanych rzeczy przed funkcją main.

/** @file mylibrary.cpp */

int kod() {
   /* wykonuje automatyczną inicjalizacje mojej ślicznej biblioteki */
   // bla bla bla
   // bla bla bla
   return 0;
   }

static int foo = kod();

0

punkt:)

0

eh, w sumie zamknięty temat, ale ktoś kiedyś przeglądając może uznać za atrakcyjne, a idealnie pasuje do wątku. Można użyć gotowego boost::assign. Jakoś tak powinno wtedy wyglądać:

#include <boost/assign/list_of.hpp>
#include <map>
#include <string>

using namespace std;
using namespace boost::assign;
     
map<string,int> months = map_list_of
    ( "january",   31 )
    ( "february",  28 )
    ( "march",     31 )
    ( "april",     30 )
    ( "may",       31 )
    ( "june",      30 )
    ( "july",      31 )
    ( "august",    31 )
    ( "september", 30 )
    ( "october",   31 )
    ( "november",  30 )
    ( "december",  31 );
0
class Outside
{
	static map<int,string> q;

	static class Inside
	{
	public:
		Inside()
		{
			cout << "Static initialization" << endl;
			q[1]="jeden";
			q[2]="dwa";
		}
	} staticInitializer;
};

map<int,string> Outside::q; // kolejność ważna!
Outside::Inside Outside::staticInitializer;

1 użytkowników online, w tym zalogowanych: 0, gości: 1