2015-06-10 4 views
0

Я работаю над 2 файлами, позволяет брать файлы file1.cpp и file2.cpp. file1.cpp содержит:Как создать статическую карту в C++?

//File 1 
#include <iostream> 
#include <map> 

struct category { 
    int id; 
}; 

void fun(); 

std::map<char, category> mymap1; 
static std::map<char, category> mymap; 
std::map<char, category>::iterator map_iter; 
std::map<char, category>::iterator map_iter1; 

int main() 
{ 

    mymap1['a'] = {20}; 
    mymap1['b'] = {30}; 
    mymap1['c'] = {40}; 

    for(int i = 0;i < 4; i++) 
     fun(); 

    return 0; 
} 

//File 2 
#include<file2.h> 
void fun() 
{ 
    mymap = mymap1; 
    map_iter = mymap.begin(); 
    for (map_iter1 = mymap1.begin(); map_iter1 != mymap1.end();++map_iter1) 
    { 
     map_iter->second.id = map_iter1->second.id - map_iter->second.id; 
     std::cout<<map_iter1->second.id<<" " <<map_iter->second.id; 
     map_iter->second.id=map_iter1->second.id; 
     ++map_iter; 
    } 

} 

Я пытаюсь инициализировать MyMap один раз, когда для запуска контура в первый раз после этой инициализации не должно произойти, как это происходит в статической переменной.

Но это поведение не отображается и каждый раз, когда mymap получает инициализацию.

Я не хочу, чтобы «id» получал инициализацию каждый раз.

Как работать?

+0

изменения MyMap на указатель карты и вставить проверку перед назначением его в 'весело()' – buygrush

+0

Вы можете перенести статические карты декларации в FUNC поэтому он будет создан только один раз: 'void fun() {static std :: map mymap = mymap1; // ...} ' – NathanOliver

+0

Сделал то же самое только сейчас .. Проверяю, что .. @buygrush –

ответ

0

Если я правильно понял ваш вопрос, вы должны проверить перед назначением mymap функции fun(), если вы хотите ее инициализировать только один раз.

Например, вы можете передать переменную по ссылке в своей функции, добавив параметр, назовем его foo. Вы инициализируете его до 0 до цикла for, добавьте проверку в свою функцию, чтобы убедиться, что foo == 0 и увеличивайте ее в конце.

0

Создайте функцию, которая возвращает статическую карту

static std::map<char, category> maps() { 
    static std::map<char, category> m; 
    //... 
    return m; 
} 
+0

Внимание к 'static' впереди: http://stackoverflow.com/questions/6953248/static-nonmember-or-static-nonmember-function – davidhigh

+0

Имейте в виду, что в зависимости от на вашем компиляторе это может привести к функции, которая не является потокобезопасной. Например, версия Visual Studio, к которой я применила, будет иметь нарушение прав доступа, если два потока впервые вошли в fucntion очень близко друг к другу. Возможно, это было исправлено в C++ 1x, так как теперь он явно использует параллелизм. – BeeOnRope

+1

Согласно §6.7.4, инициализация статических переменных является потокобезопасной, качество реализации меняется. – sp2danny

0

вообще «инициализировать один раз» делается так:

void foo() 
{ 
    static bool first = true; 

    if(first) 
    { 
     first = false; 
     // first time init here 
    } 

    // rest of func here 
} 

Также в записке о каких статических средств:

статический на глобальная переменная:
* доступно только в местной единице перевода

статический на функции:
* доступны только в блоке местного перевода

статический на локальной переменной:
* сохраняется через вызовы, только один экземпляр даже на нескольких/рекурсивный вызов

статического на классе/член структуры:
* только один экземпляр, независимо от количества родительских объектов

+0

Этот подход не является потокобезопасным, и поэтому подходит только в процессе, который, как известно, является однопоточным. – BeeOnRope

Смежные вопросы