gpt4 book ai didi

c++ - 享元模式和 C++ 模板

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:36:20 26 4
gpt4 key购买 nike

我有享元模式。我有抽象类字形。我有类 Letter 和派生自 Glyph 的抽象代码。我有从 Code 派生的 YusciiCode、UniCyrCode 和 UniLatCode。

我的享元工厂可以这样做:

    template <class T>
class CodeFactory : public AbstractCodeFactory
{
public:
CodeFactory();
virtual ~CodeFactory();
virtual Glyph* GetFlyweight(unsigned int code);
virtual Glyph* GetFlyweight(string letter);
private:
// pool of flyweights (codes or letters)
map <unsigned int, Glyph*> my_code_map;
map <string, Glyph*> my_letter_map;
};

可以这样做:

template <class key, class T>
class CodeFactory : public AbstractCodeFactory
{
public:
CodeFactory();
virtual ~CodeFactory();
virtual Glyph* GetFlyweight(key code);
private:
// pool of flyweights (codes or letters)
map <key, Glyph*> my_code_map;
};

在第一个示例中,GCC 链接器告诉我没有 Letter(unsigned int) 和 xxxCode(string) 构造函数。事实上没有,GCC 是正确的,但是有没有比定义这些构造函数更好的方法来做到这一点?

在第二个 ecample 中,GCC 编译器告诉我该行有一个错误

map <key, Glyph*>::iterator it;

函数 GetFlyweight。

这种享元模式的实现方式是什么?

我需要使用它。这是我当前的实现:

class AbstractCodeFactory
{
public:
AbstractCodeFactory();
virtual ~AbstractCodeFactory();
virtual Glyph* GetFlyweight(unsigned int code) = 0;
virtual Glyph* GetFlyweight(string letter) = 0;
};


template <class T>
class CodeFactory : public AbstractCodeFactory
{
public:
CodeFactory();
virtual ~CodeFactory();
virtual Glyph* GetFlyweight(unsigned int code);
virtual Glyph* GetFlyweight(string letter);
private:
// pool of flyweights (codes or letters)
map <unsigned int, Glyph*> my_code_map;
map <string, Glyph*> my_letter_map;
};


template <class T>
CodeFactory<T>::CodeFactory()
{
// TODO Auto-generated constructor stub

}

template <class T>
CodeFactory<T>::~CodeFactory()
{
// TODO Auto-generated destructor stub
map <unsigned int, Glyph*>::iterator it;
map <string, Glyph*>::iterator l_it;
for (it = my_code_map.begin(); it != my_code_map.end(); ++it)
{
delete it->second;
it->second = NULL;
my_code_map.erase(it);
}
for (l_it = my_letter_map.begin(); l_it != my_letter_map.end(); ++l_it)
{
delete l_it->second;
l_it->second = NULL;
my_letter_map.erase(l_it);
}
}

template <class T>
Glyph* CodeFactory<T>::GetFlyweight(unsigned int code)
{
map <unsigned int, Glyph*>::iterator it;
T *code_class = NULL;
if ((it = my_code_map.find(code)) == my_code_map.end())
{
my_code_map.insert(pair <unsigned int, Glyph*> (code, code_class = new T(code)));
return code_class;
}
else return it->second;
}

template <class T>
Glyph* CodeFactory<T>::GetFlyweight(string letter)
{
map <string, Glyph*>::iterator it;
T *letter_class = NULL;
if ((it = my_letter_map.find(letter)) == my_letter_map.end())
{
my_letter_map.insert(pair <string, Glyph*> (letter, letter_class = new T(letter)));
return letter_class;
}
else return it->second;
}

最佳答案

由于您的享元工厂只能生成 Letter、YusciiCode、UniCyrCode 或 UniLatCode 对象,因此我会选择第二个选项(指示 key 类型的第二个模板参数。

编译器对声明 map <key, Glyph*>::iterator it; 的问题是编译器无法确定 map<key, Glyph*>::iterator 是指类型还是其他。这是因为它取决于模板参数 key , 你可能拥有 map<> 的专长某处成员 iterator 不是类型。
为了帮助编译器,您必须指定您期望 map<ket, Glyph*>::iterator指的是一个类型名:

typename map<key, Glyph*>::iterator it;

关于c++ - 享元模式和 C++ 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3690761/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com