根据参数数量生成对象

huangapple go评论94阅读模式
英文:

generate object based on parameters count

问题

我想重构我的代码。我有3个类,它们只有在初始化时所需的点数不同(从2到4)。它们都具有相同的方法名称和数量,但它们的实现方式(真的)不同。

我想要一个类,根据点数,构建适当的对象。我还想能够声明所有贝塞尔曲线的函数原型(使用这个类),例如:

void function(const bezier& curve);

头文件:

  1. #pragma once
  2. #include "glm/vec2.hpp"
  3. struct Custom // 将被删除的临时结构
  4. {
  5. float distance;
  6. glm::vec2 point;
  7. };
  8. // 需要找到一种方法,只有一个类适用于所有贝塞尔曲线
  9. class Bezier3
  10. {
  11. public:
  12. glm::vec2 m_P_0, m_P_1, m_P_2, m_P_3;
  13. // 计数仅用于调试目的,将被删除
  14. size_t m_Count = 100;
  15. Bezier3(const glm::vec2& p_0, const glm::vec2& p_1, const glm::vec2& p_2, const glm::vec2& p_3, const size_t& m_Count);
  16. ~Bezier3();
  17. glm::vec2 operator() (const float& t);
  18. glm::vec2 derivate(const float& t);
  19. Custom findClosestPoint(const glm::vec2& point, double& start);
  20. };
  21. class Bezier2
  22. {
  23. public:
  24. glm::vec2 m_P_0, m_P_1, m_P_2;
  25. size_t m_Count = 100;
  26. Bezier2(const glm::vec2& p_0, const glm::vec2& p_1, const glm::vec2& p_2, const size_t& m_Count);
  27. ~Bezier2();
  28. glm::vec2 operator() (const float& t);
  29. glm::vec2 derivate(const float& t);
  30. Custom findClosestPoint(const glm::vec2& point);
  31. };
  32. class Bezier1
  33. {
  34. public:
  35. glm::vec2 m_P_0, m_P_1;
  36. size_t m_Count = 100;
  37. Bezier1(const glm::vec2& p_0, const glm::vec2& p_1, const size_t& m_Count);
  38. ~Bezier1();
  39. glm::vec2 operator() (const float& t);
  40. glm::vec2 derivate(const float& t);
  41. Custom findClosestPoint(const glm::vec2& point);
  42. };

这是可能的吗?我进行了一些研究,但找不到任何信息。

英文:

I would like to refactor my code. I have 3 classes that differ only by the number of points they take to be initialized (from 2 to 4). They all have the same method name and number, but their implementation is (really) different.

I would like to have a class that, depending on the number of points, constructs the appropriate object. I would also like to be able to declare function prototypes (using this class) for all bézier curves, eg:

void function(const bezier& curve);

The header file:

  1. #pragma once
  2. #include "glm/vec2.hpp"
  3. struct Custom // tmp struc will be removed
  4. {
  5. float distance;
  6. glm::vec2 point;
  7. };
  8. //need to find a way to have only one class for all of bezier
  9. class Bezier3
  10. {
  11. public:
  12. glm::vec2 m_P_0, m_P_1, m_P_2, m_P_3;
  13. // count is for debugging purposes will be removed
  14. size_t m_Count = 100;
  15. Bezier3(const glm::vec2& p_0, const glm::vec2& p_1, const glm::vec2& p_2, const glm::vec2& p_3, const size_t& m_Count);
  16. ~Bezier3();
  17. glm::vec2 operator() (const float& t);
  18. glm::vec2 derivate(const float& t);
  19. Custom findClosestPoint(const glm::vec2& point, double& start);
  20. };
  21. class Bezier2
  22. {
  23. public:
  24. glm::vec2 m_P_0, m_P_1, m_P_2;
  25. size_t m_Count = 100;
  26. Bezier2(const glm::vec2& p_0, const glm::vec2& p_1, const glm::vec2& p_2, const size_t& m_Count);
  27. ~Bezier2();
  28. glm::vec2 operator() (const float& t);
  29. glm::vec2 derivate(const float& t);
  30. Custom findClosestPoint(const glm::vec2& point);
  31. };
  32. class Bezier1
  33. {
  34. public:
  35. glm::vec2 m_P_0, m_P_1;
  36. size_t m_Count = 100;
  37. Bezier1(const glm::vec2& p_0, const glm::vec2& p_1, const size_t& m_Count);
  38. ~Bezier1();
  39. glm::vec2 operator() (const float& t);
  40. glm::vec2 derivate(const float& t);
  41. Custom findClosestPoint(const glm::vec2& point);
  42. };

Is this possible? I did some research, but couldn't find anything.

答案1

得分: 1

你可以这样做:

  1. class Bezier
  2. {
  3. public:
  4. Bezier(const glm::vec2& p_0, const glm::vec2& p_1, const size_t& m_Count) : impl(Bezier1(p_0, p_1, m_Count)) {}
  5. Bezier(const glm::vec2& p_0, const glm::vec2& p_1, const glm::vec2& p_2, const size_t& m_Count) : impl(Bezier2(p_0, p_1, p_2, m_Count)) {}
  6. Bezier(const glm::vec2& p_0, const glm::vec2& p_1, const glm::vec2& p_2, const glm::vec2& p_3, const size_t& m_Count) : impl(Bezier3(p_0, p_1, p_2, p_3, m_Count)) {}
  7. // 其他函数
  8. // ...
  9. private:
  10. std::variant<Bezier1, Bezier2, Bezier3> impl;
  11. };

如果你想要在运行时动态决定类型,例如如果你有一个存储 glm::vec2 的向量,你也可以这样做。

英文:

You can do something like this:

  1. class Bezier
  2. {
  3. public:
  4. Bezier(const glm::vec2&amp; p_0, const glm::vec2&amp; p_1, const size_t&amp; m_Count) : impl(Bezier1(p_0, p_1, m_Count)) {}
  5. Bezier(const glm::vec2&amp; p_0, const glm::vec2&amp; p_1, const glm::vec2&amp; p_2, const size_t&amp; m_Count) : impl(Bezier2(p_0, p_1, p_2, m_Count)) {}
  6. Bezier(const glm::vec2&amp; p_0, const glm::vec2&amp; p_1, const glm::vec2&amp; p_2, const glm::vec2&amp; p_3, const size_t&amp; m_Count) : impl(Bezier3(p_0, p_1, p_2, p_3, m_Count)) {}
  7. // Other functions
  8. // ...
  9. private:
  10. std::variant&lt;Bezier1, Bezier2, Bezier3&gt; impl;
  11. };

If you want to decide on type dynamically, e.g. if you have vector of glm::vec2 you can do that too.

huangapple
  • 本文由 发表于 2023年3月4日 07:15:54
  • 转载请务必保留本文链接:https://go.coder-hub.com/75632620.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定