有人会介意帮我解决C ++链接/编码难题吗?
我有一个类Shape。 Shape需要使用类Center的私有数据成员,x和y坐标。我宣布朋友类Shape;然后#include" center.h"在Shape.h中。在Shape.cpp中,我定义了我的ostream&运营商LT;< (ostream& ostr,const Center& c)函数,它使用c.xCord; c.yCord访问中心的私人数据成员。
当我尝试编译Shape.cpp时,我得到了那些数据变量的访问错误,比如我还没有将Shape声明为友元类。我觉得这与编译时的链接顺序有关。我该如何解决这个问题?
#ifndef CENTER_H
#define CENTER_H
class Center
{
public:
Center(double x, double y) { xCord = x; yCord = y; }
// constructor
friend class Shape;
// allow Shape to use Center's x and y values
private:
double xCord;
// X-coordinate
double yCord;
// Y-coordinate
};
#endif
#ifndef SHAPE_H
#define SHAPE_H
#include "center.h"
#include <iostream>
using namespace std;
class Shape
{
public:
Shape(double x, double y) : s_center(x, y) {}
// constructor
void moveCenter();
// moves the center of the shape
friend ostream& operator<< (ostream& ostr, const Center& c);
// allows the printing of the Center object
virtual void printCenter();
// returns the center of the shape
virtual double printArea();
// returns the area of the shape
virtual bool checkSurface(Shape& s) = 0;
// checks if the shape can fit into
// a given surface
virtual double findArea() = 0;
// calculates the area of the shape
private:
Center s_center;
// center of the shape
};
#endif
// in shape.cpp
ostream& operator<< (ostream& ostr, const Center& c)
{
ostr << "(" << c.xCord << ", " << c.yCord << ")";
return ostr;
}
答案 0 :(得分:4)
根据C ++ 11标准的第11.3 / 10段:
友谊既不是继承的也不是传递。 [...]
如果班级A
是班级friend
的{{1}},而功能B
是班级f()
的{{1}},则不会同时friend
A
f()
个friend
。
如果您希望B
访问operator <<
的私有成员变量,则应将friend
声明为Center
类Center
:
#ifndef CENTER_H
#define CENTER_H
#include <ostream>
class Center
{
public:
Center(double x, double y) { xCord = x; yCord = y; }
friend class Shape;
friend std::ostream& operator<< (std::ostream& ostr, const Center& c);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
private:
double xCord;
double yCord;
};
#endif
答案 1 :(得分:1)
您的运营商&lt;&lt;与类形状无关。友谊不会扩展到运营商。您需要将该特定运营商声明为朋友。