Làm cách nào để sử dụng cout << myclass


82

myclass là một lớp C ++ do tôi viết và khi tôi viết:

myclass x;
cout << x;

Làm cách nào để xuất ra 10hoặc 20.2, giống như một integerhoặc một floatgiá trị?

Câu trả lời:


100

Điển hình là do quá tải operator<<cho lớp của bạn:

struct myclass { 
    int i;
};

std::ostream &operator<<(std::ostream &os, myclass const &m) { 
    return os << m.i;
}

int main() { 
    myclass x(10);

    std::cout << x;
    return 0;
}

9
Lưu ý rằng nếu myclasscó bất kỳ privatetrường nào và bạn muốn operator<<()xuất chúng, myclassnên khai báo std::ostream& operator<<(std::ostream&, myclass const&)là bạn.
Justin Time - Khôi phục Monica

3
Điều này không nên const myclass &mthay vì myclass const &m?
Nubcake

3
@Nubcake: Không. Theo như trình biên dịch quan tâm, cả hai đều có nghĩa giống nhau, nhưng tôi vẫn coi dạng tiền tố là sai. Để đọc một ++ khai C, bạn bắt đầu từ những gì đang được công bố, và làm việc theo cách của bạn ra bên ngoài, với constsau khi loại, nó nói: m is a reference to a const myclass. Với nó trước khi các loại, nó nói "m là một tham chiếu đến một const` myclass, mà là ngay trên mép rách rưới giữa vô nghĩa và thật sự sai ngữ pháp.
Jerry Coffin

1
Đối với bất kỳ ai bối rối như tôi, hãy đặt toán tử nạp chồng bên ngoài định nghĩa lớp của bạn (giống như trong ví dụ).
umnikos

1
@Lorenzo: Không, nó không thể là một chức năng thành viên. Xem stackoverflow.com/a/9814453/179910 để biết thêm chi tiết.
Jerry Coffin

22

Bạn cần quá tải <<toán tử,

std::ostream& operator<<(std::ostream& os, const myclass& obj)
{
      os << obj.somevalue;
      return os;
}

Sau đó, khi bạn thực hiện cout << x( trong trường hợp của bạn xlà loại nào myclass), nó sẽ xuất ra bất cứ điều gì bạn đã nói với nó trong phương thức. Trong trường hợp của ví dụ trên, nó sẽ là x.somevaluethành viên.

Nếu loại thành viên không thể được thêm trực tiếp vào an ostream, thì bạn cũng cần phải nạp chồng <<toán tử cho loại đó, sử dụng phương pháp tương tự như trên.


4
Đó là toán tử dịch trái, không phải "toán tử luồng". Trong ngữ cảnh của Iostreams, nó là toán tử chèn hoặc khai thác, nhưng nó không bao giờ là toán tử luồng.
Billy ONeal

1
Xin lỗi, vâng, bạn nói đúng. Đó chỉ là những gì tôi đã gọi nó trong đầu vì tôi có xu hướng chỉ sử dụng nó khi xử lý các luồng. Trong trường hợp này, nó sẽ là toán tử chèn như bạn nói, thay vì chỉ là toán tử luồng. Tôi đã cập nhật câu trả lời của mình để xóa bit đó.
Rich Adams

14

nó rất dễ dàng, chỉ cần thực hiện:

std::ostream & operator<<(std::ostream & os, const myclass & foo)
{
   os << foo.var;
   return os;
}

Bạn cần trả về một tham chiếu đến hệ điều hành để chuỗi outpout (cout << foo << 42 << endl)


-3

Thay thế:

struct myclass { 
    int i;
    inline operator int() const 
    {
        return i; 
    }
};
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.