наследование — вывод переменных-членов при сращивании данных. Переполнение стека

Здравствуйте, я в настоящее время сталкиваюсь с проблемой, когда я хочу вывести данные из 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, пока данные не отображаются пустыми. Как мне обойти эту проблему?

0

Решение

Есть несколько способов справиться с этим. Один из способов, очевидно, состоит в том, чтобы сделать членов 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;
}

Я также исправил другие проблемы, которые нашел, так что вышеприведенное действительно работает.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]