Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 继承和友元函数,从基类访问受保护的成员_C++_Oop_C++11_C++17 - Fatal编程技术网

C++ 继承和友元函数,从基类访问受保护的成员

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:

比如说,我有一个很大的班级圈子,有很多成员和职能。为了处理大量数据,我决定创建PotentialCirlce类(只有3个成员-x、y、r),基于PotentialCirlce进行大部分预处理,并在最后阶段创建对象循环

a) 这是正确的方法吗?它是否会影响性能,或者更确切地说,我应该只使用圆圈

在我看来,我可以使用继承:

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,三路比较会更好。
记住“圆”是一个潜在的圆。(圈:公共潜力圈)。如果potentialCircle的所有子类都具有更大的值,那么它可能是基类中的一个虚函数,并且在基类函数不足时被派生类重写。
class potentialCircle
{
public:
    unsigned int get_radius() const { return radius; }
....
};