这是一个问题:
class DrawingsContainer {
public:
std::vector<std::pair<std::string, std::shared_ptr<Drawing>>> getDrawings() { return drawings; }
private:
std::vector<std::pair<std::string, std::shared_ptr<Drawing>>> drawings;
};
我有一个变量
std::vector<std::pair<std::string, std::shared_ptr<Drawing>>> drawings
我正在使用std::pair
,因为我需要将我放入向量中的项目放在我放置它们的顺序中,因此std::map
是否定的。 (我使用这个容器在屏幕上绘制所有内容)。
std::string
用于搜索目的。
class Drawing {
public:
// only one can be active, thus both are initialized as nullptr at the start and one type is overwritten on creation
explicit Drawing(
std::string act,
std::unique_ptr<sf::Text> txt = nullptr,
std::unique_ptr<sf::RectangleShape> rectShape = nullptr
) {
active = std::move(act);
text = std::move(txt);
rect = std::move(rectShape);
}
std::string getActive() { return active; }
std::shared_ptr<sf::Text> getText() { return text; }
std::shared_ptr<sf::RectangleShape> getRect() { return rect; }
private:
std::string active;
std::shared_ptr<sf::Text> text;
std::shared_ptr<sf::RectangleShape> rect;
};
我觉得这不是一个好的解决方案,因为如果我在结构中使用的不仅仅是sf::Text
和sf::RectangleShape
类,该怎么办?感觉很脏。
理想情况下,我希望有这种结构:
[[&#34; arena&#34;,sf :: RectangleShape],[&#34; optionsButton&#34;,sf :: Text]]。
其中sf::RectangleShape
和sf::Text
是基类sf::Drawable
的衍生物,当然它们有不同的方法我需要调用。
这是一个很好的解释,演示了层次结构(第一张图片) - https://www.sfml-dev.org/documentation/2.4.2/classsf_1_1Drawable.php
所以我想知道是否有更好的方法来做到这一点。
答案 0 :(得分:2)
您似乎可以使用常规多态:
struct Drawing
{
std::string name;
std::shared_ptr<sf::Drawable> drawable;
};
所以
class DrawingsContainer
{
public:
const std::vector<Drawing>& getDrawings() const { return drawings; }
private:
std::vector<Drawing> drawings;
};
答案 1 :(得分:1)
使用typedef减少长丑陋的类型名称。由于可能只有一个绘图容器的实例,因此可以像这样使用单例模式。
struct node_t
{
sf::Text text;
sf::RectangleShape rect;
};
class Drawing {
private:
std::vector<std::shared_ptr<node_t>> tools_;
};
typedef std::vector<std::pair<std::string, std::shared_ptr<Drawing>>> container_t;
class DrawingsContainer {
public:
static const std::unique_ptr<DrawingsContainer>& GetInstance()
{
static std::unique_ptr<DrawingsContainer> ptr(new DrawingsContainer());
return ptr;
}
private:
DrawingsContainer() {}
container_t drawings_;
};