문제

무언가를 출력하는 함수를 작성하고 싶습니다. ostream 그것은 전달되어 다음과 같이 스트림을 반환합니다.

std::ostream& MyPrint(int val, std::ostream* out) {
  *out << val;
  return *out;
}

int main(int argc, char** argv){
    std::cout << "Value: " << MyPrint(12, &std::cout) << std::endl;
    return 0;
}

내가했던 것처럼 이와 같이 값을 인쇄하고 출력 연산자 체인에 함수 호출을 포함시키는 것이 편리합니다. main().

그러나 작동하지 않으며 이것을 인쇄합니다.

$ ./a.out
12Value: 0x6013a8

원하는 출력은 다음과 같습니다.

Value: 12

이것을 어떻게 고칠 수 있습니까? 정의해야합니까? operator<< 대신에?

업데이트: 원하는 출력이 무엇인지 명확히했습니다.

Update2 : 어떤 사람들은 왜 그런 숫자를 인쇄 할 것인지 이해하지 못했고, 직접 인쇄하는 대신 함수를 사용합니다. 이것은 단순화 된 예이며 실제로 기능은 int.

도움이 되었습니까?

해결책

함수를 고칠 수 없습니다. 사양의 어떤 것도 컴파일러가 동일한 표현식에서 일부 관련없는 연산자와 관련하여 특정 순서로 표현식의 함수 호출을 평가하는 데 필요한 것은 없습니다. 따라서 호출 코드를 변경하지 않고는 MyPrint() 후에 평가하십시오 std::cout << "Value: "

여러 연속 << 연산자로 구성된 표현식에 대해서는 왼쪽에서 오른쪽에서 오른쪽으로 주문됩니다. 연산자의 지점 << 스트림을 반환하는 것은 연산자가 묶여있을 때 각각의 LHS가 왼쪽으로 운영자를 평가하여 공급된다는 것입니다.

LHS가 없기 때문에 무료 기능 호출로 동일한 것을 달성 할 수 없습니다. MyPrint() 객체를 동일하게 반환합니다 std::cout, 그리고 또한 그렇습니다 std::cout << "Value: ", 당신은 효과적으로하고 있습니다 std::cout << std::cout, 그것은 그 16 진수를 인쇄하고 있습니다.

원하는 출력은 다음과 같습니다.

Value: 12

"올바른"일은 실제로 연산자 <<을 무시하는 것입니다. 이것은 종종 친구로 만들거나 이것을 수행해야한다는 것을 의미합니다.

class WhateverItIsYouReallyWantToPrint {
    public:
    void print(ostream &out) const {
        // do whatever
    }
};

ostream &operator<<(ostream &out, const WhateverItIsYouReallyWantToPrint &obj) {
    obj.print(out);
}

재정의 경우 operator<< 예를 들어 인쇄하려는 여러 형식이 있고 각각의 기능을 작성하려는 여러 형식이 있기 때문에 수업에 적합하지 않습니다. 그러면 운영자 체인 아이디어를 포기하고 전화해야합니다. 기능을하거나 그렇지 않으면 객체를 생성자 매개 변수로 취하는 여러 클래스를 작성합니다.

다른 팁

MyPrint를 친구 연산자와 함께 클래스로 만들고 싶습니다 << :

class MyPrint
{
public:
    MyPrint(int val) : val_(val) {}
    friend std::ostream& operator<<(std::ostream& os, const MyPrint& mp) 
    {
        os << mp.val_;
        return os;
    }
private:
    int val_;
};

int main(int argc, char** argv)
{
    std::cout << "Value: " << MyPrint(12) << std::endl;
    return 0;
}

이 방법을 사용하려면 MyPrint 객체를 원하는 스트림에 삽입해야합니다. 실제로 활성화 된 스트림을 변경할 수있는 능력이 필요한 경우 다음을 수행 할 수 있습니다.

class MyPrint
{
public:
    MyPrint(int val, std::ostream& os) : val_(val), os_(os) {}
    friend std::ostream& operator<<(std::ostream& dummy, const MyPrint& mp) 
    {
        mp.os_ << mp.val_;
        return os_;
    }
private:
    int val_;
    std::ostream& os_
};

int main(int argc, char** argv)
{
    std::cout << "Value: " << MyPrint(12, std::cout) << std::endl;
    return 0;
}

두 가지 옵션이 있습니다. 첫 번째, 이미 가지고있는 것을 사용하는 것은 다음과 같습니다.

std::cout << "Value: ";
MyPrint(12, &std::cout);
std::cout << std::endl;

더 C ++처럼 다른 하나는 교체하는 것입니다. MyPrint() 적절한 std::ostream& operator<<. 이미 하나가 있습니다 int, 그래서 나는 단지 더 복잡한 것을 할 것입니다.

#include <iostream>

struct X {
    int y;
};

// I'm not bothering passing X as a reference, because it's a
// small object
std::ostream& operator<<(std::ostream& os, const X x)
{
    return os << x.y;
}

int main()
{
    X x;
    x.y = 5;
    std::cout << x << std::endl;
}

함수가 평가되는 순서 때문에 기대하는 일을 할 방법이 없습니다.

그런 타조에 직접 글을 써야 할 특별한 이유가 있습니까? 그렇지 않다면 MyPrint가 문자열을 반환하도록하십시오. MyPrint 내부의 스트림을 사용하여 출력을 생성하려면 strstream을 사용하고 결과를 반환하십시오.

첫째, 통과하지 않을 이유가 없습니다. ostream 포인터보다는 참조로 :

std::ostream& MyPrint(int val, std::ostream& out) {
  out << val;
  return out;
}

당신이 정말로 사용하고 싶지 않다면 std::ostream& operator<<(std::ostream& os, TYPE), 당신은 이것을 할 수 있습니다 :

int main(int argc, char** argv){
    std::cout << "Value: ";
    MyPrint(12, std::cout) << std::endl;
    return 0;
}

참조로 포인터를 변경 한 후 다음을 수행 할 수 있습니다.

#include <iostream>

std::ostream& MyPrint(int val, std::ostream& out) {
    out << val;
    return out;
}

int main(int, char**) {
    MyPrint(11, std::cout << "Value: ") << std::endl; 

    return 0;
}

구문 MyPrint 본질적으로 끊어지지 않은 것입니다 operator<< 그러나 추가 논쟁이 있습니다.

귀하의 경우 대답은 분명히 다음과 같습니다.

 std::cout << "Value: " << 12 << std::endl;

충분하지 않으면보고 싶은 출력을 설명하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top