2009-10-04 6 views
0
class object_1 
{ 
    public: 
    ... 

    friend ofstream& operator<<(ofstream &out, const object_1 &obj_1); 
    friend object_2; 

    private: 

    char *pCh_mem1; 
    char *pCh_mem2; 
    int *pInt_mem1; 
    int *pInt_mem2; 
}; 


class object_2 
{ 
public: 
... 
friend ofstream& operator<<(ofstream &out, const object_2 &obj_2); 
friend object_1; 
}; 

Object1의 구현 파일이 일반적입니다. Ctor, Dtor 및 일부 메소드. 머리말에 메소드 선언을 게시하지 않았으므로 내 문제와 관련이 없습니다.개체 및 연산자 오버로드 C++

나는 개체 수명을 논의하는 것이 매우 중요합니다. 그것은 내가 정말로 알아야 할 것입니다. 무슨 일이 일어나고 main에서 object_2를 호출하면 연산자 오버로드 함수가 호출됩니다. 그럼 연산자 오버로드 함수가 호출됩니다 : 여기

ostream& operator<<(ostream& out, const object_2& obj_2) 
{ 
object1::display(out) //Calls method display in object1's I.F. 
return out; 
} 

우리는 다음과 같습니다

void object_1::display(std::ostream &out) 
{ 
out << left << setw(28) << "Person" << setw(20) << "Place" ; 
out << right << setw(5) << "Thing" << setw(5) << "Idea" << endl; 

out << left << setw(28) << "----" << setw(20) << "--------" ; 
out << right << setw(5) << "----- " << setw(5) << "------" << endl; 
} 

구현 파일의 맨 위에있는 IOMANIP 라이브러리. 그래서 setw (X)와 모든 것이 정의됩니다. 0은 모두 콘솔에 뿌리 내리고 있습니다. 내 물건이 범위를 벗어 났습니까? 나는 그렇게하기 전에 모든 것을 할 때 잘 동작하기 때문에 그렇게 생각한다. 즉,이 함수를 n e라고 부르면 연산자 오버로드의 본문 이외에 어디에서 작동하는지 알 수 있습니다. 나는 개체를 다시 선언되어 있기 때문에 생각 : 나는 내가 첫 번째 개체의 ctor에 메인에서 전달 된 정보를 인쇄하는 데 필요한 포맷 방법을 인쇄 한 후

ostream& operator<<(ostream& out, const object_2& obj_2); 

; object_1. 그럴 때 우리는 비슷한 오버로드 함수와 같은 구현 파일에 있습니다. 제 개체 과부하 함수의 과부하 양 메소드를 호출 임 :

ostream& operator<<(ostream& out, const object_1& obj_1) 
{ 
out << obj_1.pCh_mem1 << obj_1.pCh_mem2; 
return out; 
} 

// 메인 object_2 obj_2 (4); 유 위 참조처럼라고 objc_2되면

static void method1() 
{ 
//do stuff 
} 
static void method2() 
{ 
    //do stuff 
} 
static void method3() 
{ 
    //do stuff 
} 
int main(void) 
{ 
    method1(); 
    method2(); 
    method3(); 
    cout << obj_2; 
    return 0; // and such 
} 

, object2의 클래스에 대한 연산자 오버로드는 다음 호출됩니다. 내 개인 회원은 불법적 인 운영으로 인해 사용할 수 없습니다. 나는 나의 질문을 추측한다. object2의 연산자 오버로딩 함수에서 object1의 개인 멤버를 어떻게 인쇄 할 수 있습니까? static_cast의? 나는 메인에서 무작위 발췌 문장을 가지고 있는데, 복잡하다. 나는 그것을 바꿀 수 없다. 난 당신이 위의 내용 참조처럼 수행하기 위해 노력했습니다 무엇

ostream& operator<<(ostream& out, const object_2& obj_2) 
{ 
object1::display(out) //Calls method display in object1's I.F. 
return out; 
} 

은 다른 객체의 메소드를 호출하고, 자신의 정보를 얻을 수 있습니다. 하지만 그 정보는 모두 NULL입니다! 하나의 I.F.에서 뛰어 다니고 있습니다. 다음과 그 모든 NULL에 !!

+1

"object1"은 "object_1"과 같지만 "stock_1"은 "object_1"이라고 가정합니다. 그리고 "디스플레이"는 정적 방법입니까? 그것은 마지막 코드 스 니펫의 호출에서 정적 인 것처럼 보이지만 정의 ("stock"와 "object1"이 같은 경우)는 정적 메서드가 아닙니다. 이 일요일 아침 일찍 평소보다 느린 지 모르겠지만 코드 선택은 다소 혼란스러워 보입니다. –

답변

1

AFAICT, object_1object_2은 친구가 아닌 클래스와 관련이 없습니다. 따라서 object_2에는 object_1과 관련된 상태가 없습니다.

따라서 object_1 인 것처럼 object_2을 인쇄하려고하면이 기능이 작동하지 않을 수 있습니다.

ostream& operator<<(ostream& out, const object_2& obj_2) 
{ 
object1::display(out) //Calls method display in object1's I.F. 
return out; 
} 

근처에있는 실제 코드이 될 수있는 방법을 호출 할 수 있습니다 (하지만, 당신은 아마이 말은하지 않았다 더 object_1이 존재하지 않기 때문에 실종 이후 :이 호출이 전혀 작동 놀라운 일이다 세미콜론도 가능).

달성하고자하는 것이 분명하지 않습니다. object_2object_1에서 상속 받기를 원하면 object_2pCh_mem1 등의 멤버가 포함될 수 있습니다. object_2의 구성원을 object_1 유형의 개체로 지정 하시겠습니까?

+0

object_2가 object_1에서 상속 받기를 원합니다. – user40120

+0

@lampshade : 좋습니다. 그러니'object_1'을'object_2'의 기본 클래스로 만듭니다. 'object_2'가 액세스 할 수 있도록 멤버를 보호 할 수 있습니다. –

+0

Mr.L 고맙습니다. 내 많은 간과 된 문제 중 또 하나를 불러 일으켰습니다. 그것은 단지 간단한 수정이었습니다! =) – user40120

0
ostream& operator<<(ostream& out, const object_2& obj_2) 
{ 
    out << object_1[thatIndexThatIstoreditAt] 
    return out; 
} 

이 자료에 대해 몇 가지 보고서를 작성해야합니다. =)