LINUX.ORG.RU

C++: Может ли класс иметь static const переменую типа map ?


0

0

Вот на отрез отказывается собираться:

#include <iostream>
#include <string>
#include <map>

using namespace std;

class TWidget
{
public:
enum TAttrType
{
EVisibility,
EActivity,
};

const static map <TAttrType, string> iAttrs;
};

const TWidget::iAttrs[TWidget::TAttrType::EVisibility] = "Hello world";
const TWidget::iAttrs[TWidget::TAttrType::EActivity] = "Hello cruel world";

int main (int argc, char** argv)
{
cout << TWidget::iAttrs[TWidget::TAttrType::EVisibility];

return 0;
}


Понимаю что бред, просто интересно, вдруг когда-то понадобится...

1. Вопервых не понятно как обратится из вне класса к содержимому TAttrType.
2. Вовторых не понятно может ли клас содержать static const переменную типа map, и как тогда ее инициализировать ?

anonymous

Вот такой код будет компилироваться,
проблема с const map, то что
вот такие операции запрещены:
map[foo] = bar;
т.к. они модифицируют map:

#include <iostream>
#include <string>
#include <map>

using namespace std;

class TWidget {
public:
enum TAttrType {
EVisibility,
EActivity,
};

const static map <TAttrType, string> iAttrs;
};

const map <TWidget::TAttrType, string> TWidget::iAttrs;

int main (int argc, char** argv)
{
map<TWidget::TAttrType, string>::const_iterator it =
TWidget::iAttrs.find(TWidget::EVisibility);
cout << it->second;

return 0;
}

fghj ★★★★★
()
Ответ на: комментарий от fghj

fghj!
получается что у тебя iAttrs определена, но не содержит в себе вообще ничего.
find - ничего не найдет.

Так как всетаки в static const map засунуть что-то? Как инициализировать ?

Как видеш я пытался засунуть пару EVisibility : "Hello world".

:)

anonymous
()
Ответ на: комментарий от anonymous

> Так как всетаки в static const map засунуть что-то? Как инициализировать ?

1. Сменить язык программирования.

2. Загнать данные в временную не-const map, а static const map инициализировать через deep-copy этой временной. Зависит от реализации map.

anonymous
()
Ответ на: комментарий от anonymous

ха-ха, а как deep-copy?
ведь до этого всетаки хоть какая-то переменная типа map должна быть инициализирована...
Обычнач инициализируется в момент программы.
а Global static тоже как-то определить нужно :)


Что-то тут как-то темно.

anonymous
()
Ответ на: комментарий от anonymous

>Так как всетаки в static const map засунуть что-то? 

ключевое здесь "static const", это можно сделать либо здесь

const map <TWidget::TAttrType, string> TWidget::iAttrs(другая_map);

можно еще например так:

 int main (int argc, char** argv) 
{ 
	map <TWidget::TAttrType, string> &attr = const_cast<map <TWidget::TAttrType, string> &>(TWidget::iAttrs);
	attr[TWidget::EVisibility] = "Hello world";
	map<TWidget::TAttrType, string>::const_iterator it =
		TWidget::iAttrs.find(TWidget::EVisibility);
	cout << it->second << endl; 

	return 0; 
}

но наиболее правильное решение на мой взгляд,
что-нибудь типа:

#include <iostream> 
#include <string> 
#include <map> 

using namespace std; 

class TWidget { 
public: 
	enum TAttrType { 
		EVisibility, 
		EActivity, 
	}; 

	static const map <TAttrType, string>& iAttrs();
}; 

const map <TWidget::TAttrType, string>& TWidget::iAttrs()
{
	static map <TWidget::TAttrType, string> attrs;
	if (attrs.empty()) {
		attrs[TWidget::EVisibility] = "Hello world";
	}
	return attrs;
}


int main (int argc, char** argv) 
{ 	

	map<TWidget::TAttrType, string>::const_iterator it =
		TWidget::iAttrs().find(TWidget::EVisibility);
	cout << it->second << endl; 

	return 0; 
}

fghj ★★★★★
()
Ответ на: комментарий от fghj

А, прикольно.
Что-то в это есть.
Спасибо!

anonymous
()

#include <map>
#include <iostream>

class Q
{
public:
        static const std::map<int, int> &map;

        static std::map<int, int>& init_map()
        {
                static std::map<int, int> m;
                m[1234] = 5678;
                return m;
        }
};

const std::map<int, int>& Q::map = Q::init_map();

int
main()
{
        std::cout << Q::map.find(1234)->second << std::endl;
        return 0;
}

execve
()

Конструктор template<class InputIterator> map( InputIterator _First, InputIterator _Last );

gpg
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.