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

How to get private data when you're using a initialization list?

本文关键字:获取 数据 初始化 列表 何获取      更新时间:2023-10-16

我现在正在C++中学习面向对象程序,我刚刚遇到了一个小问题。

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

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(声明为友元,但似乎不起作用。请给我一个建议!非常感谢。

lineFrom2PointsCDreapta的朋友,而不是CPunctCDreapta继承自CPunct,这并不能使此函数成为CPunct的朋友。CCD_ 7本身是相当无用的。它的数据成员是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()
}

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

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