【问题标题】:How to get private data when you're using a initialization list?使用初始化列表时如何获取私有数据?
【发布时间】:2019-11-16 10:14:51
【问题描述】:

我现在正在学习 C++ 中的 OOP,但遇到了一个小问题。

在基类中使用列表初始化时,如何从派生类中的基类获取私有数据?

class  CPunct
{
private:
    double x;
    double y;
public:
    CPunct(double a, double b) : x(a), y(b) {}   //initialization list 
};

class CDreapta :public CPunct
{
public: 
    friend void lineFrom2Points(CPunct& a, CPunct& b) // Function to find the line by two points
    {
        double expr1 = b.y - a.y; //expresion 1
        double expr2 = a.x - b.x;  //expresion 2
        double expr3 = expr1 * (a.x) + expr2 * (a.y); //expresion 3

        if (expr2 < 0)
        {
            std::cout << "The line passing through points a and b is: "
                << expr1 << "x " << expr2 << "y = " << expr3 << "\n";
        }
        else
        {
            std::cout << "The line passing through points a and b is: "
                << expr1 << "x + " << expr2 << "y = " << expr3 << "\n";
        }
    }
};

在我的代码中,我尝试将使用来自基类 CPunct 的私有数据的函数 (lineFrom2Points) 声明为友元,但它似乎不起作用。 请给我一个建议!谢谢!

【问题讨论】:

    标签: c++ oop inheritance


    【解决方案1】:

    lineFrom2PointsCDreapta 的朋友,而不是CPunctCDreapta 继承自 CPunct 的事实并没有使这个函数成为 CPunct 的朋友。 CPunct 本身就很没用。它的数据成员是private,即使在派生类中也无法访问。您可能希望将它们设为 protected 或添加公共或受保护的成员函数来访问它们。

    几个例子:

    class CPunct {
    private:
        double x;
        double y;
    
    public:
        CPunct(double a, double b) : x(a), y(b) {}
    
        friend void lineFrom2Points(CPunct& a, CPunct& b) {
            // can access a.x, a.y, b.x, b.y here
        }
    };
    
    class CPunct {
    protected:
        double x;
        double y;
    
    public:
        CPunct(double a, double b) : x(a), y(b) {}
    };
    
    class CDreapta : public CPunct {
    public: 
        using CPunct::CPunct;  // inherit the CPunct constuctor
    
        friend void lineFrom2Points(CDreapta& a, CDreapta& b) {
            // can access a.x, a.y, b.x, b.y here
        }
    };
    
    class CPunct {
    private:
        double x_;
        double y_;
    
    public:
        CPunct(double a, double b) : x_(a), y_(b) {}
    
        double x() const { return x_; }
        double y() const { return y_; }
    };
    
    class CDreapta : public CPunct {
    public:
        using CPunct::CPunct;
    };
    
    void lineFrom2Points(CDreapta& a, CDreapta& b) {
        // can access a.x, a.y, b.x, b.y here via x() and y()
    }
    

    【讨论】:

    • 非常感谢您的帮助!不知道可以继承基类的构造函数:/!
    • @Ion,这是 C++11 的特性。请参阅here 了解更多信息。
    【解决方案2】:

    对于像 CPunct 这样的类型,没有必要将其成员设为私有。所以最好将这个类重新定义为带有公共成员的结构。

    struct CPunct
     {
      double x;
      double y;
    
      CPunct(double x_, double y_) : x(x_), y(y_) {}
     };
    

    【讨论】:

      猜你喜欢
      • 2011-06-05
      • 2019-08-28
      • 2018-09-17
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多