Menu
Coddy logo textTech

Operatory strumieniowe

Część sekcji Programowanie obiektowe ścieżki C++ w Coddy. Lekcja 43 z 104.

Operatory wstawiania (<<) i pobierania (>>) pozwalają używać własnych klas razem z std::cout i std::cin. W przeciwieństwie do operatorów omówionych do tej pory, muszą być zaimplementowane jako funkcje niestowarzyszone, ponieważ lewym operandem jest strumień, a nie Twoja klasa.

class Point {
    int x, y;
    
public:
    Point(int x, int y) : x(x), y(y) {}
    
    // Zadeklaruj jako friend, aby uzyskać dostęp do prywatnych pól
    friend std::ostream& operator<<(std::ostream& os, const Point& p);
    friend std::istream& operator>>(std::istream& is, Point& p);
};

std::ostream& operator<<(std::ostream& os, const Point& p) {
    os << "(" << p.x << ", " << p.y << ")";
    return os;
}

std::istream& operator>>(std::istream& is, Point& p) {
    is >> p.x >> p.y;
    return is;
}

Oba operatory zwracają referencję do strumienia, co umożliwia łączenie ich w łańcuch, na przykład std::cout << p1 << p2. Operator wstawiania przyjmuje obiekt przez referencję const, ponieważ tylko odczytuje dane, natomiast operator pobierania przyjmuje referencję niebędącą const, ponieważ modyfikuje obiekt.

Teraz możesz naturalnie używać Point ze strumieniami:

Point p(3, 4);
std::cout << "Location: " << p << std::endl;    // Wynik: Location: (3, 4)

Point p2(0, 0);
std::cin >> p2;    // Wczytaj dwie liczby całkowite do p2
challenge icon

Wyzwanie

Łatwy

Zbudujmy klasę Temperature, której można wygodnie używać z std::cout i std::cin dzięki przeciążeniu operatorów strumieniowych. To praktyczny przykład sytuacji, w której chcesz wyświetlać temperatury w czytelnym formacie i w naturalny sposób odczytywać je z wejścia.

Utworzysz dwa pliki, aby uporządkować kod:

  • Temperature.h: Zdefiniuj klasę Temperature, która przechowuje wartość temperatury (typu double) oraz oznaczenie jednostki (typu char, 'C' dla stopni Celsjusza lub 'F' dla stopni Fahrenheita). Twoja klasa powinna zawierać:
    • Prywatne składowe przechowujące wartość temperatury i jednostkę
    • Konstruktor domyślny, który inicjalizuje temperaturę jako 0.0 stopni Celsjusza
    • Konstruktor parametryzowany, który przyjmuje wartość i jednostkę
    • Metody pobierające getValue() i getUnit() (obie oznaczone jako const)
    • Deklaracje zaprzyjaźnionych operatorów wstawiania do strumienia (<<) i pobierania ze strumienia (>>)

    Zaimplementuj operatory strumieniowe jako funkcje niezwiązane z klasą:

    • Operator wstawiania powinien wyświetlać temperaturę w formacie VALUE UNIT (np. 25.5 C lub 77.9 F). Użyj jednego miejsca po przecinku dla wartości.
    • Operator pobierania powinien odczytać ze strumienia wartość i znak jednostki, a następnie zapisać je w obiekcie Temperature.

    Oba operatory muszą zwracać referencję do strumienia, aby umożliwić łączenie operacji.

  • main.cpp: Odczytaj z wejścia dwie temperatury. Każda temperatura jest podana w osobnym wierszu w formacie value unit (np. 25.5 C).

    Utwórz dwa obiekty Temperature i użyj operatora pobierania, aby odczytać je z std::cin. Następnie wyświetl je za pomocą operatora wstawiania w tym formacie:

    Temperature 1: <temp1>
    Temperature 2: <temp2>

    Na przykład, jeśli dane wejściowe to:

    25.5 C
    98.6 F

    Dane wyjściowe powinny wyglądać tak:

    Temperature 1: 25.5 C
    Temperature 2: 98.6 F

Użyj std::fixed i std::setprecision(1) z <iomanip>, aby sformatować wartość temperatury z dokładnie jednym miejscem po przecinku. Nie zapomnij o strażnikach nagłówka w pliku nagłówkowym.

Spróbuj swoich sił

#include <iostream>
#include "Temperature.h"

int main() {
    // TODO: Utwórz dwa obiekty Temperature
    
    // TODO: Użyj operatora pobierania (>>), aby odczytać dwie temperatury z std::cin
    
    // TODO: Wyświetl temperatury za pomocą operatora wstawiania (<<)
    // Format:
    // Temperature 1: <temp1>
    // Temperature 2: <temp2>
    
    return 0;
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C++ online