2014-03-29 1 views
0

C에서 C++로 전환 할 때 클래스 기밀성에 대한 기본하지만 귀찮은 문제가 있습니다. 나는 여기서 약간의 연구를했는데, 아마도 나는 정말로 바보스럽고, yor 방법을 제대로 사용할 수 없다. 나를 도울 수 있겠 니?오버로드 된 '<<'를 통해 클래스의 개인 변수 인쇄

과부하 된 '< <'연산자를 통해 클래스의 전용 멤버를 인쇄하는 것이 문제입니다.

#include Vector.hh 
#include <iostream> 
using namespace std; 

int main() 
{ 
    Vector Vector1; 
    cout << endl << " Start " << endl << endl; 
    cin >> Vector1; 
    cout << Vector1; 

}

을 파일에 파일에서

Vector.cpp

#include "Vector.hh" 
#include <iostream> 

void Vector::PrintVector(Vector Wek) 
{ 
    std::cout << Wek.Val1 << Wek.Val2 << Wek.Val3 << std::endl; 
} 


std::istream& operator >> (std::istream &Strm, Vector &Wek) 
{ 
    //It actually works with no problem so i'll pass it 
} 


std::ostream& operator << (std::ostream &Strm, Vector Wek) 
{ 
    Vector::PrintVector(Wek); 
    return Strm; 
} 

을 Vector.hh

#include <iostream> 

class Vector { 
double Val1, Val2, Val3; 

public: 
void PrintVector(Vector); 
    //There is also a constructor but it doesn't really matter 
} 

및 MAIN.CPP에 :의 코드에하자

시도 할 때 컴파일하려면 g ++가 말합니다 :

g++ -c -g -Iinc -Wall -pedantic -o obj/Vector.o src/Vector.cpp 
src/Vector.cpp:12:37: error: no 'void Vector::PrintVector(Vector)' member function declared in class 'Vector' 
void Vector::PrintVector(Vector Wek) 
           ^
src/Vector.cpp: In function 'std::ostream& operator<<(std::ostream&, Vector)': 
src/Vector.cpp:29:1: error: 'PrintVector' is not a member of 'Vector' 
Vector::PrintVector(Wek); 

make: Fatal error: Command failed for target `obj/Vector.o' 

제게 기본 지식을 올바르게 배울 수 있습니까?

답변

0

클래스 함수가 ​​정적이며 특정 클래스 객체에서 호출되지 않거나 정적이 아니며 함수 내부에서 사용할 수있는 클래스 인스턴스에서 호출되어야합니다. 당신은이 방법을 혼합했습니다.

class Vector 
{ 
    static void PrintVector(const Vector& Wek) 
    { 
    std::cout << Wek.Val1 << Wek.Val2 << Wek.Val3 << std::endl; 
    } 
}; 

// to call 
Vector::PrintVector(Wek); 

또는

class Vector 
{ 
    void PrintVector() const 
    { 
     std::cout << Wek.Val1 << Wek.Val2 << Wek.Val3 << std::endl; 
    } 
}; 

// to call 
Wek.PrintVector(); 

중 하나는 괜찮지 만, 나는 후자를 선호 : 당신은 두 가지 중 하나를 선택해야합니다.

다른 문제는 스트림 연산자를 구현 한 방법입니다. 이 연산자는 객체를 출력하기 위해 스트림을 사용합니다. 이 스트림을 Strm이라고 부르지 만 조작자에게는 사용되지 않습니다. 인쇄 기능이 인쇄 출력 스트림에 하드 코드됩니다.

난 당신이 PrintVector 기능을 제거하고 다음과 같이 연산자를 구현 제안 :

class Vector 
{ 
    friend std::ostream& operator << (std::ostream &Strm, const Vector& Wek); 

}; 

std::ostream& operator << (std::ostream &Strm, const Vector& Wek) 
{ 
    Strm << Wek.Val1 << Wek.Val2 << Wek.Val3 << "\n"; 
    return Strm; 
} 

이제 할 수있는 이러한 파일 스트림과 같은 스트림, 모든 종류의 출력. 또한 비공개 멤버에 액세스 할 수 있도록 연산자를 friend으로 선언해야했습니다.

속도를 높이기 위해 참조 할 매개 변수를 일부 변경했으며 endl"\n"으로 바 꾸었습니다. 파일에 쓸 때 더 빠릅니다 (이유는 Google이 될 수 있습니다).

출력 멤버간에 공백을 추가하는 것이 좋습니다. 이렇게하면 읽기 쉽도록 할 수 있습니다.

희망이 도움이됩니다.

0

오류가 간단합니다. 개체가없는 인스턴스 메서드는 사용할 수 없습니다. 시도 :

Wek.PrintVector(); 

또한 상수 참고로 전달하고 복사하지 마십시오.

0

일반적인 방법은 operator<<()friend 클래스의 기능을 만드는 것입니다. Friend 함수는 클래스의 private 멤버에 액세스 할 수 있습니다. 따라서 operator<<()은 개인 회원에게 직접 인쇄하여 인쇄 할 수 있습니다. sample을 참조하십시오.

인쇄용으로 공용 기능 PrintVector을 정의하는 것은 좋지 않은 생각입니다. 공개이므로 사용자 (클래스를 사용하는 개발자)는 < < 연산자 대신이를 사용하기 시작할 수 있습니다. 사용자가 사용하지 못하게하십시오.

관련 문제