0

안녕하세요, 저는 현재 두 개의 클래스에서 데이터를 출력하고 싶습니다. 하나는 기본 클래스이고 하나는 파생 클래스이고, 나는 과부하로 < < 연산자를 출력하고 싶습니다. 나는이 그것이 나에게 알려줍니다 실행하려고하고 B는 그 구성원이 개인이기 때문에 의미가 범위를 벗어난 경우데이터를 접합 할 때 멤버 변수 출력하기 C++

#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 클래스에서이 문제를 해결하는 방법을 모르겠습니다. 나는 A와 B에 접근하기위한 getter 메소드를 만들려고했지만 데이터는 공백으로 나온다. 클래스 B의 멤버로 클래스 A의 객체를 추가하여 클래스 B의 멤버에 대한 액세스를 허용하려고 시도했지만 심지어 데이터가 비어있게되었습니다. 이 문제를 어떻게 해결할 수 있습니까?

+2

왜 이미 수업에서 사용한 이름의 회원 이름을 지정하고 있습니까? – imreal

+1

문제와 직접적인 관련이 없지만 지금 당장은 B가'A'의 중첩 된 클래스입니다 ('A'에서 파생 된 것 이외에). 그걸 원하니? – jogojapan

+2

닉이 말한 것 외에'A '의 생성자에도 문제가있다. 'pLast'와'pFirst'의 크기가 아니라 멤버'A'의 현재 크기에 따라 공간을 할당합니다. – jogojapan

답변

2

이 문제를 처리 할 수있는 방법은 여러 가지가 있습니다. 한 가지 방법은 분명히 A의 구성원을 개인이 아닌 보호하도록하는 것입니다. 그런 다음 파생 클래스 B이 액세스 할 수 있습니다.

또 다른 방법은 실제로 게터 기능입니다. 그들이 당신을 위해 작동하지 않는다는 사실은 생성자의 문제와 코드의 다른 문제와 관련이 있습니다. 그러나 공용 getter는 (파생 클래스가 아닌) 사용자가 데이터 멤버의 값에 액세스 할 수 있도록하는 단점이 있습니다. A에 별도의 operator<<을 정의하고 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; 
} 

을 여기

내가 귀하의 경우 의미가 믿는 세 번째 방법이있다 또한 내가 발견 한 다른 문제를 해결 했으므로 위의 내용이 실제로 작동합니다.