您好,我目前面临一个问题,我想从 2 个单独的类输出数据,一个是基类,一个是派生类,我想重载 <<运算符一次输出所有数据,但似乎很难这样做,我有这样的东西:
#include <iostream>
using namespace std;
class A
{
char* A;
char* B;
public:
A() {A = ' '; B = ' ';}
A(char* pLast, char* pFirst)
{
A = new char [strlen(pLast) + 1];
B = new char [strlen(pFirst) + 1];
strcpy(A,pLast);
strcpy(B,pFirst);
};
}
class C:public A
{
int X;
char Y;
int Z;
public:
C(char* A, char* B, int X, char Y, int Z)
:A(A,B)
{
//do stuff here
}
friend std::ostream& operator<<(std::ostream& out, const C& outPut)
{
out << outPut.A << "," << outPut.B << "," <<outPut.X<< "," << outPut.Y << "," << outPut.Z << endl;
return out;
}
};
当我尝试运行它时,它告诉我 A 和 B 超出了范围,这是有道理的,因为这些成员在 A 类中是私有的,我不知道如何解决这个问题。我尝试创建 getter 方法来访问 A 和 B,但数据显示为空白。我什至尝试将类 A 的对象添加为类 B 的成员,以尝试允许访问类 B 中的成员,但数据仍然为空白。如何解决此问题?
有几种方法可以解决这个问题。一种方法显然是使A
的成员受到保护而不是私有。然后,派生类B
可以访问它们。
另一种方式确实是吸气函数。它们不适合您的事实与构造函数中的问题和代码中的其他问题有关。但是,公共获取者也有一个缺点,即允许任何人(不仅仅是派生类)访问数据成员的值。
这是第三种方法,我认为在您的情况下是有意义的:在A
中定义一个单独的operator<<
,并在为B
定义运算符时使用该运算符:
#include <cstring>
#include <iostream>
using namespace std;
class A
{
char* _a;
char* _b;
public:
A()
: _a(),_b()
{ }
A(const char *pLast, const char *pFirst)
: _a(new char [std::strlen(pLast)]),
_b(new char [std::strlen(pFirst)])
{
strcpy(_a,pLast);
strcpy(_b,pFirst);
}
friend std::ostream& operator<<(std::ostream& out, const A& obj)
{
out << obj._a << "," << obj._b;
return out;
}
};
class B : public A
{
int _x;
char _y;
int _z;
public:
B(const char *pLast, const char *pFirst, int x, char y, int z)
: A(pLast,pFirst),
_x(x),_y(y),_z(z)
{ }
friend std::ostream& operator<<(std::ostream& out, const B& obj)
{
out << static_cast<const A&>(obj) << ','
<< obj._x << ','
<< obj._y << ','
<< obj._z;
return out;
}
};
int main()
{
B b("hello","world",1,'a',3);
std::cout << b << std::endl;
return 0;
}
我还纠正了我发现的其他问题,因此上述方法实际上有效。