使用初始化列表时如何获取私有数据?

Posted

技术标签:

【中文标题】使用初始化列表时如何获取私有数据?【英文标题】: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) 声明为友元,但它似乎不起作用。 请给我一个建议!谢谢!

【问题讨论】:

【参考方案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_) 
 ;

【讨论】:

以上是关于使用初始化列表时如何获取私有数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用easy-peasy在初始化时从商店显示我的列表?

C ++在类中初始化一个空列表

Dart类(构造函数、单例)

如何初始化通过远程方法调用获取的 Hibernate 实体?

F11 workerman 聊天列表初始化之数据获取长连接下实现聊天列表实时更新完结

无法在初始渲染中显示待办事项列表