c – 在基类中引用不同大小的std :: array而不是std :: array
我有以下问题.考虑这些课程
class face { virtual std::vector<ptr>& get_vertices(void) const = 0; }; class triangle : public face { private: std::vector<ptr> vertices; public: std::vector<ptr>& get_vertices(void) const { return vertices; }; }; class quadrilateral : public face { private: std::vector<ptr> vertices; public: std::vector<ptr>& get_vertices(void) const { return vertices; }; }; 显然,三角形和四边形将始终分别具有3和4个顶点. 感谢阅读和可能的回答!! 解决方法
std ::不同大小的数组是不同的类型,所以我看不到任何你想要的方法.但是,如果将begin()和end()const迭代器返回到内部容纳的容器或包含两者的小范围对象,该怎么办?这样您就可以将容器的大小与接口分离,并将其留给实现.
编辑:只是为了澄清,为了隐藏数据存储表示(在这种情况下,std :: array的大小),您将需要自己的face迭代器类.这很容易在指针方面实现,因为对于每个面专业化,您都知道底层数据结构的大小,开始和结束.但是显然你不能直接在界面中使用std :: array的begin()和end(). 例: 这是一个快速而肮脏的示例,说明如何使用指针实现部分正向迭代器行为.我使用虚拟基类和OP中的一个实现作为起点.我也省略了所有构造函数,赋值运算符等.它还假设一个类Edge(可能是2D或3D点?). class face { public: typedef Edge* iterator; typedef const Edge* const_iterator; virtual iterator begin() = 0; virtual const_iterator begin() const = 0; virtual iterator end() = 0; virtual const_iterator end() const = 0; virtual size_t size() const = 0; virtual ~face() {}; }; class triangle : public virtual face { public : virtual iterator begin() {return m_edges.begin();} virtual const_iterator begin() const {return m_edges.begin();} virtual iterator end() {return m_edges.end();} virtual const_iterator end() const {return m_edges.end();} virtual size_t size() const {return m_edges.size();} private: std::array<Edge,3> m_edges; }; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |