vect2 · One line
▶ Aprender vect2 (One line) paso a paso · explicación de vect2
Otras versiones: Multi line · Orden del main · one line · Orden del main · multi line · Cristi
Código línea a línea
Tres columnas: el código, el trozo del subject o del main que obliga a escribir esa línea, y el por qué.
vect2.hpp
| Código | Subject | Por qué |
|---|---|---|
#pragma once | Que el .hpp no se incluya dos veces. | |
| ||
#include <iostream> | printable with the << operator | std::ostream para el << que imprime. El main usa std::cout y solo incluye vect2.hpp. |
| ||
class vect2 | Create a class vect2 | La clase. |
{ | ||
private: | x e y solo los toca la propia clase. | |
int x; | vector of dimension 2 containing ints | Dimensión 2 → dos ints. Este es v[0]. |
int y; | vector of dimension 2 containing ints | Este es v[1]. |
| ||
public: | You will find a main in this directory that must work with your class. | Todo lo que usa el main. |
// ---------- forma canónica ---------- | ||
vect2() : x(0), y(0) {} | vect2 v1; // 0, 0 | Sin nada → {0, 0}. Lista de inicialización: x(0) = x empieza en 0. |
vect2(int a, int b) : x(a), y(b) {} | vect2 v2(1, 2); // 1, 2 | Con dos números → {1, 2}. |
vect2(const vect2& o) : x(o.x), y(o.y) {} | const vect2 v3(v2);vect2 v4 = v2; | Copia. v4 = v2 al nacer también es copia, no operator=. |
vect2& operator=(const vect2& o) { x = o.x; y = o.y; return *this; } | v2 = 3 * v2; | Me cambia → sin const. Me devuelvo a mí → vect2 &. |
~vect2() {} | Destructor vacío: no hay nada que liberar. | |
| ||
// ---------- [] ---------- | ||
int operator[](int i) const { return i == 0 ? x : y; } | v3[1] | Leer. v3 es const → hace falta la versión const. Da una copia del número. |
int& operator[](int i) { return i == 0 ? x : y; } | v1[1] = 12; | Cambiar. v1[1] = 12 necesita la casilla de verdad → int &. |
| ||
// ---------- + ---------- | ||
vect2& operator+=(const vect2& o) { x += o.x; y += o.y; return *this; } | v2 += v3;v2 += v2 += v3; | Me cambia y me devuelvo a mí. v2 += v2 += v3 encadena → vect2 &. |
vect2 operator+(const vect2& o) const { vect2 t(*this); return t += o; } | v2 = v3 + v3 *2; | Uno nuevo → vect2. Solo miro → const (v3 es const). Copia de mí + +=. |
vect2& operator++() { ++x; ++y; return *this; } | ++v4 | ++v4: me sumo 1 y me devuelvo a mí → vect2 &. |
vect2 operator++(int) { vect2 t(*this); ++(*this); return t; } | v4++ | v4++: me cambia, pero devuelve cómo era antes → vect2. El (int) solo lo distingue de ++v4. |
| ||
// ---------- - ---------- | ||
vect2& operator-=(const vect2& o) { x -= o.x; y -= o.y; return *this; } | v1 -= v2; | Igual que += restando. |
vect2 operator-(const vect2& o) const { vect2 t(*this); return t -= o; } | v1 = v1 - v1 + v1; | Uno nuevo: copia de mí y -=. |
vect2& operator--() { --x; --y; return *this; } | --v4 | Igual que ++v4 restando. |
vect2 operator--(int) { vect2 t(*this); --(*this); return t; } | v4-- | Igual que v4++ restando. |
vect2 operator-() const { return vect2(-x, -y); } | -v2 | Menos de un solo lado: uno nuevo con los dos signos cambiados. No me cambia → const. |
| ||
// ---------- * ---------- | ||
vect2& operator*=(const vect2& o) { x *= o.x; y *= o.y; return *this; } | Extra: el main no lo usa. Multiplica componente a componente. | |
vect2 operator*(const vect2& o) const { vect2 t(*this); return t *= o; } | Extra: el main no lo usa. Copia de mí y *=. | |
vect2& operator*=(int n) { x *= n; y *= n; return *this; } | multiplication by a scalarv1 *= 42; | Por un número (escalar). Me cambia y me devuelvo a mí. |
vect2 operator*(int n) const { vect2 t(*this); return t *= n; } | (vect2(2,2) * 2 == vect2(4,4))v3 *2 | v * 2: uno nuevo. Solo miro → const (v3 es const). |
friend vect2 operator*(int n, const vect2& v) { return v * n; } | v2 = 3 * v2; | 3 * v: a la izquierda hay un int, no un vect2 → no puede ser miembro. friend = función de fuera escrita aquí. |
| ||
// ---------- == != ---------- | ||
bool operator==(const vect2& o) const { return x == o.x && y == o.y; } | (v1 == v3) | Sí/no → bool. Iguales si x e y coinciden. |
bool operator!=(const vect2& o) const { return !(*this == o); } | (v1 != v3) | Lo contrario de ==. |
| ||
// ---------- << ---------- | ||
friend std::ostream& operator<<(std::ostream& os, const vect2& v) { return os << "{" << v.x << ", " << v.y << "}"; } | printable with the << operator std::cout << "{" << v[0] << ", " << v[1] << "}" << std::endl; | A la izquierda está cout → friend. Escribe en os (nunca std::cout) y devuelve os para encadenar. |
}; |
vect2.cpp
| Código | Subject | Por qué |
|---|---|---|
#include "vect2.hpp" | Expected files: vect2.cpp, vect2.hpp | El .cpp es obligatorio, pero todo está en el .hpp: basta con incluirlo. |