C++ 继承和友元函数,从基类访问受保护的成员
比如说,我有一个很大的班级圈子,有很多成员和职能。为了处理大量数据,我决定创建PotentialCirlce类(只有3个成员-x、y、r),基于PotentialCirlce进行大部分预处理,并在最后阶段创建对象循环 a) 这是正确的方法吗?它是否会影响性能,或者更确切地说,我应该只使用圆圈 在我看来,我可以使用继承:C++ 继承和友元函数,从基类访问受保护的成员,c++,oop,c++11,c++17,C++,Oop,C++11,C++17,比如说,我有一个很大的班级圈子,有很多成员和职能。为了处理大量数据,我决定创建PotentialCirlce类(只有3个成员-x、y、r),基于PotentialCirlce进行大部分预处理,并在最后阶段创建对象循环 a) 这是正确的方法吗?它是否会影响性能,或者更确切地说,我应该只使用圆圈 在我看来,我可以使用继承: class potentialCircle { protected: point_t center; unsigned int radius; public:
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的一部分
bool Circle::is_greater(const std::pair<potentialCircle, int>& point_pair) const;
bool圆::大于(常数std::对和点对)常数;
但我无法访问potentialCircle的受保护数据成员,尽管Circle继承自potentialCircle。
也许我应该把is_greater()定义为namepsace的一部分,让它成为Circle和potentialCircle的朋友
你有更好的主意吗?比较不同类型的对象并不是一个好方法,因为它在实践中毫无意义。这种比较的目的是什么 现在,即使您只有一个类,如果排序不是类型内部的,那么最好使用外部类进行排序
class CircleDiameterLess
{
public:
bool operator()(const Circle &lhs, const Circle &rhs)
{
return lhs.diameter < rhs.diameter;
}
};
像alternative\u center
这样的成员毫无意义。圆只有一个中心。如果你的班级不尊重基本期望,那么代码将很难维护,因为没有人知道一个圈在3个月内有2个中心,包括你
在像您这样的情况下,添加公共访问器是有意义的
class potentialCircle
{
public:
unsigned int get_radius() const { return radius; }
....
};
通过这种方式,您仍然可以在对数据进行只读访问的同时将数据设置为私有(或有时设置为受保护)。这样,您就可以随心所欲地编写比较函数。在实践中,如果你有一个代表圆的类,你通常希望至少能够通过一个函数获得基本属性,比如半径,面积,边界矩形
另一件事是,公共派生(从potentialCircle
)只有在有其他派生类的情况下才有意义。然而,如果是这样的话,你会如何比较其他类型的圆圈
注意事项:
- 用C++ 20,三路比较会更好。
class potentialCircle
{
public:
unsigned int get_radius() const { return radius; }
....
};