Вывод переменных-членов при сращивании данных C++

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

1 ответ

Решение

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

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

Другие вопросы по тегам