Здравствуйте, я в настоящее время сталкиваюсь с проблемой, когда я хочу вывести данные из 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, я не знаю, как обойти это. Я попытался создать методы получения для доступа к A и B, но данные выглядят пустыми. Я даже попытался добавить объект класса A в качестве члена класса B, чтобы попытаться разрешить доступ к членам класса B, пока данные не отображаются пустыми. Как мне обойти эту проблему?
Есть несколько способов справиться с этим. Один из способов, очевидно, состоит в том, чтобы сделать членов A
защищенный, а не частный. Производный класс B
может получить к ним доступ.
Другим способом действительно являются функции получения. Тот факт, что они не работают для вас, связан с проблемами в ваших конструкторах и другими проблемами в вашем коде. Но у публичных добытчиков также есть недостаток кто-нибудь (не только производные классы), чтобы получить доступ к значениям ваших членов данных.
Вот третий подход, который, я считаю, имеет смысл в вашем случае: operator<<
в A
и использовать этот оператор, когда вы определяете тот для 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;
}
Я также исправил другие проблемы, которые нашел, так что вышеприведенное действительно работает.
Других решений пока нет …