存储结构的更好方法

时间:2018-02-21 07:22:57

标签: c++ sfml

这是一个问题:

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::Textsf::RectangleShape类,该怎么办?感觉很脏。

理想情况下,我希望有这种结构:
[[&#34; arena&#34;,sf :: RectangleShape],[&#34; optionsButton&#34;,sf :: Text]]。
其中sf::RectangleShapesf::Text是基类sf::Drawable的衍生物,当然它们有不同的方法我需要调用。 这是一个很好的解释,演示了层次结构(第一张图片) - https://www.sfml-dev.org/documentation/2.4.2/classsf_1_1Drawable.php

所以我想知道是否有更好的方法来做到这一点。

2 个答案:

答案 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_;
};