2012-12-13 2 views
0

저는 아티스트 이름 (문자열), albumtitle (문자열) 및 트랙 개체 목록을 저장하도록 설계된 앨범 클래스가 있습니다. (벡터). 스트림 기반 출력을 사용하려면 "< <"연산자를 오버로드하려고합니다.벡터에 포함 된 개체 목록을 인쇄 할 때 cout을 사용하려고 시도하고 순서가 잘못되었습니다.

관련 코드는 이것이다 :

순서대로 인쇄해야
std::ostream& Album::printTracks (std::ostream &out, std::vector<Track> &t) 
{ 
    unsigned int i; 
    for (i=0; i<t.size(); i++) 
     out << " " << t.at(i); 
    return out; 
} 
std::ostream& operator<< (std::ostream &out, Album &a) 
{ 
    out << "Artist name: " << a.artistName << "\n" << 
     "Album Title: " << a.albumTitle << "\n" << 
     "Tracks: " << a.printTracks(out,a.getTracks()); 
    return out; 
} 

:

  • 아티스트의 이름
  • 앨범 제목
  • 트랙리스트

대신이 whe를 인쇄합니다.

  • 트랙리스트
  • 아티스트 이름
  • 앨범 타이틀

"트랙 :"메모리 위치 다음에 N 나는 그것을 테스트 데이터를 제공합니다.

Constructor for "Track Class" is: 
Track::Track (std::string t, Duration* d) 
    { 
     title = t; 
     duration = d; 
    } 

은 "트랙"클래스 "< <"오버로드 코드는 다음과 같습니다

std::ostream& operator<< (std::ostream &out, Track &t) 
    { 
    out << "Title: " << t.title << "\n" << 
     "Duration: " << *t.duration << "\n"; 
    return out; 
    } 

그리고 최종 코드를 출력에 사용되는 것은 :

Duration* d = new Duration(3,4,50); //creating duration objects for testing 
Duration* d2 = new Duration(5,7,300); 
Duration* d4 = new Duration(3,3,50); 
Track t1 = Track("Test",d); //creating track objects 
Track t2 = Track("Test2",d2); 
Track t3 = Track("Test3",d4); 
std::vector<Track> tracks; //forming tracks into vector 
tracks.push_back(t1); 
tracks.push_back(t2); 
tracks.push_back(t3); 
Album a = Album("Test Artist","Test Album",tracks); //create album object 
cout << a << endl; // output album object 

궁금 왜 순서 예상대로 인쇄되지 않습니까?

+1

부수적으로, 여러분이 인쇄하고있는 것들을 const 참조로 가져와야합니다. – chris

+1

우리가 적시에 당신을 도울 수 있도록 오류를 재현하는 [SSCCE] (http://www.sscce.org)를 게시하십시오. –

+0

@ Code-Guru 이는 7 개의 다른 파일에 저장되어있는 코드 전체를 제공한다는 것을 의미합니다.이 코드는 문제와 관련이 없지만 올바르게 컴파일하려면 거의 모두 필요합니다. –

답변

5

인수가 평가 될 순서가 지정되지 않았습니다. 그 중 하나는 부작용 (트랙 인쇄)이 있으므로 먼저 평가되면 먼저 인쇄됩니다.

+0

주문을 지정하는 방법은 무엇입니까? –

+1

@TheGeneral, 첫 번째 이후에 별도의 출력 명령문에 트랙을 인쇄하십시오. – chris

+3

@TheGeneral :'... "트랙 :"; a.printTracks (out, a.getTracks()); ... '는 한 가지 방법입니다. –

관련 문제