【发布时间】:2020-07-03 00:44:09
【问题描述】:
假设我有一个大类Circle,它有很多成员和函数。为了处理大量数据,我决定创建类 PotentialCirlce(只有 3 个成员 - x、y、r),基于 PotentialCirlce 进行大部分预处理,并在最后阶段创建对象Circle。
a) 这是正确的方法吗?它会影响性能还是我应该只使用 Circle。
在我看来我可以使用继承:
class potentialCircle {
protected:
point_t center;
unsigned int radius;
public:
potentialCircle(int a, int b, unsigned int r) : center{ point_t(a,b) }, radius{ r } {}
potentialCircle() = delete;
potentialCircle(const potentialCircle&) = default;
potentialCircle(potentialCircle&&) = default;
potentialCircle& operator=(const potentialCircle&) = default;
potentialCircle& operator=(potentialCircle&&) = default;
virtual ~potentialCircle() = default;
};
class Circle : public potentialCircle {
// members detected based on Hough Circle Transform
//point_t center; // coordinates of center point
point_t alternative_center; // needed when center is out of frame
//unsigned int radius; // radius
// members calculated based on Flood Fill algorithm (more realistic)
unsigned int area = 0;
float diameter = 0;
float perimeter = 0;
....
};
b) 我应该把需要比较两个不同对象的方法放在哪里?一个 Circle 类型的对象和一个 PotentialCircle? 目前,我已将以下函数定义为 Circle 的一部分
bool Circle::is_greater(const std::pair<potentialCircle, int>& point_pair) const;
但我无权访问 potentialCircle 的受保护数据成员,尽管 Circle 是从 potentialCircle 继承的。 也许我应该将 is_greater() 定义为 namepsace 的一部分,并使其成为 Circle 和 potentialCircle 的朋友。
你有更好的主意吗?
【问题讨论】:
-
记住Circle“是一个”潜在的Circle。 (圈子:公共潜力圈子)。如果potentialCircle的所有子类都有is_greater,或许它可能是基类中的一个虚函数,当基类函数不够用时被派生类覆盖。