使用初始化列表时如何获取私有数据?
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】:lineFrom2Points
是CDreapta
的朋友,而不是CPunct
。 CDreapta
继承自 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_)
;
【讨论】:
以上是关于使用初始化列表时如何获取私有数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何初始化通过远程方法调用获取的 Hibernate 实体?