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

Posted

技术标签:

【中文标题】数据拼接时输出成员变量c++【英文标题】:Outputting member variables when data is spliced c++ 【发布时间】:2012-11-29 02:50:06 【问题描述】:

您好,我目前遇到一个问题,我想从 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 类中的成员,但数据仍然为空白。我该如何解决这个问题?

【问题讨论】:

你为什么要用你已经在课堂上使用过的名字来命名成员? 与问题没有直接关系,但就目前而言,BA 的嵌套类(除了派生自A)。你想要这样吗? 除了尼克说的,A的构造函数也有问题。你根据成员A的当前大小分配空间,而不是根据pLastpFirst的大小。 【参考方案1】:

有几种方法可以解决这个问题。一种方法显然是使A 的成员受保护而不是私有。然后派生类B 可以访问它们。

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

这是第三种方法,我认为这在您的情况下是有意义的:在A 中定义一个单独的operator&lt;&lt;,并在为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++中静态成员变量和静态成员函数(笔试经历)

总结C++静态成员变量的特性总结及测试用例

C++ 介绍——自定义数据类型

gcc,c++:静态字符串成员变量导致堆损坏/分段错误

C++ 静态成员变量成员函数

C++中类里面定义 静态成员变量的问题