c++ - 数据拼接时输出成员变量c++

标签 c++ inheritance operator-overloading splice member-access

你好,我目前面临一个问题,我想从 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 类中是私有(private)的,我不知道如何解决这个问题。我尝试创建 getter 方法来访问 A 和 B,但数据显示为空白。我什至尝试将 A 类的对象添加为 B 类的成员,以尝试允许访问 B 类中的成员,但数据仍然是空白的。我该如何解决这个问题?

最佳答案

有几种方法可以解决这个问题。显然,一种方法是使 A 的成员成为 protected 而非私有(private)。派生类 B然后可以访问它们。

另一种方法确实是 getter 函数。它们对您不起作用的事实与构造函数中的问题和代码中的其他问题有关。但是公共(public) getter 也有一个缺点,即任何人(不仅仅是派生类)都可以访问您的数据成员的值。

这是第三种方法,我认为这对您的情况有意义:定义一个单独的 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;
}

我还纠正了我发现的其他问题,所以上面的方法确实有效。

关于c++ - 数据拼接时输出成员变量c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13618065/

相关文章:

c++ - 一个对象如何在 main() 和静态库中都可见?

c++ - 将对象传递给重载运算符

c++ - 使用模板模板参数对 'operator<<' 进行模糊重载

c++ - 打破C++中的封装

c++ - xcode 解决方案的 node-gyp 链接问题

python - 在 python 中使类数据可继承的正确方法是什么?

c++ - 虚函数不叫c++

c++ - ‘operator=’ 的模糊重载与 c++11 std::move and copy and swap idiom

c++ - 无法将模板类通过管道传递给 cout

c# - 如何为一组具有几乎相同功能但具有不同参数和返回类型的类创建接口(interface)?