gpt4 book ai didi

c++ - 继承和友元函数,从基类访问 protected 成员

转载 作者:行者123 更新时间:2023-12-02 10:00:32 26 4
gpt4 key购买 nike

假设我有一个包含很多成员和功能的大类 Circle。为了处理大量数据,我决定创建类 PotentialCircle(只有 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 的 protected 数据成员,尽管 Circle 是从 potentialCircle 继承的。
也许我应该将 is_greater() 定义为 namepsace 的一部分,并使其成为 Circle 和 potentialCircle 的 friend 。
你有更好的主意吗?

最佳答案

没有真正的好方法来比较不同类型的对象,因为它在实践中几乎没有意义。这种比较的目的是什么。
现在,即使您只有一个类,如果排序不是类型固有的,最好使用外部类进行排序。

class CircleDiameterLess
{
public:
bool operator()(const Circle &lhs, const Circle &rhs)
{
return lhs.diameter < rhs.diameter;
}
};
这样,您可以有多种方式对数据进行排序,并且它与 STL 配合得很好。
如果拥有一个类 circle 没有什么意义,那么代码的另一个问题是与 diameter派生自一个类 potentialCircle有一个半径。您的代码将难以维护,因为它难以理解。
您想存储直径或半径并计算另一个。
unsigned int get_diameter() const { return radius * 2; }
成员(member)喜欢 alternative_center没有意义。一个圆只有一个圆心。如果你的类(class)不尊重基本的期望,这将使代码难以维护,因为在 3 个月内没有人会知道一个圆有 2 个中心,包括你!
在像您这样的情况下,添加公共(public)访问器是有意义的。
class potentialCircle
{
public:
unsigned int get_radius() const { return radius; }
....
};
这样,您仍然可以将数据设为私有(private)(或有时 protected ),同时拥有只读访问权限。这样,您可以根据需要编写比较函数。在实践中,如果你有一个代表圆的类,你通常希望至少能够通过函数的方式获得基本属性,如半径、面积、边界矩形。
另一件事是,作为您的公共(public)派生(来自 potentialCircle )只有在您有其他派生自它的类时才有意义。但是,如果是这样的话,那么你会如何比较其他类型的圈子呢?
备注:
  • 使用 C++ 20,三路比较会更好。
  • 关于c++ - 继承和友元函数,从基类访问 protected 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62706914/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com