vect2 · Multi line
▶ Aprender vect2 (Multi line) paso a paso · explicación de vect2
Otras versiones: One 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) | v2 = 3 * v2; | Me cambia → sin const. Me devuelvo a mí → vect2 &. |
{ | ||
x = o.x; | Copio x. | |
y = o.y; | Copio y. | |
return *this; | Me devuelvo a mí. | |
} | ||
~vect2() {} | Destructor vacío: no hay nada que liberar. | |
| ||
// ---------- [] ---------- | ||
int operator[](int i) const | v3[1] | Leer. v3 es const → hace falta la versión const. Da una copia del número. |
{ | ||
return i == 0 ? x : y; | (with 0 and 1), no bound checking is required. | 0 → x, cualquier otro → y. Sin comprobar límites. |
} | ||
int& operator[](int i) | v1[1] = 12; | Cambiar. v1[1] = 12 necesita la casilla de verdad → int &. |
{ | ||
return i == 0 ? x : y; | (with 0 and 1), no bound checking is required. | 0 → x, cualquier otro → y. Sin comprobar límites. |
} | ||
| ||
// ---------- + ---------- | ||
vect2& operator+=(const vect2& o) | v2 += v3;v2 += v2 += v3; | Me cambia y me devuelvo a mí. v2 += v2 += v3 encadena → vect2 &. |
{ | ||
x += o.x; | addition | Sumo componente a componente. |
y += o.y; | addition | Lo mismo con y. |
return *this; | Me devuelvo a mí. | |
} | ||
vect2 operator+(const vect2& o) const | v2 = v3 + v3 *2; | Uno nuevo → vect2. Solo miro → const (v3 es const). |
{ | ||
vect2 t(*this); | Una copia de mí: a mí no me toco. | |
return t += o; | Le sumo a la copia y la devuelvo. Reutiliza +=. | |
} | ||
vect2& operator++() | ++v4 | ++v4: me sumo 1 y me devuelvo a mí → vect2 &. |
{ | ||
++x; | Uno más a cada componente. | |
++y; | ||
return *this; | Me devuelvo a mí. | |
} | ||
vect2 operator++(int) | v4++ | v4++: me cambia, pero devuelve cómo era antes → vect2. El (int) solo lo distingue. |
{ | ||
vect2 t(*this); | Una copia de mí: a mí no me toco. | |
++(*this); | Me sumo con el ++ de antes. | |
return t; | Devuelvo la copia vieja. | |
} | ||
| ||
// ---------- - ---------- | ||
vect2& operator-=(const vect2& o) | v1 -= v2; | Igual que += restando. |
{ | ||
x -= o.x; | substraction | Resto componente a componente. |
y -= o.y; | substraction | |
return *this; | Me devuelvo a mí. | |
} | ||
vect2 operator-(const vect2& o) const | v1 = v1 - v1 + v1; | Uno nuevo → vect2, solo miro → const. |
{ | ||
vect2 t(*this); | Una copia de mí: a mí no me toco. | |
return t -= o; | Resto a la copia y la devuelvo. | |
} | ||
vect2& operator--() | --v4 | Igual que ++v4 restando. |
{ | ||
--x; | Uno menos a cada componente. | |
--y; | ||
return *this; | Me devuelvo a mí. | |
} | ||
vect2 operator--(int) | v4-- | Igual que v4++ restando. |
{ | ||
vect2 t(*this); | Una copia de mí: a mí no me toco. | |
--(*this); | Me resto con el -- de antes. | |
return t; | Devuelvo la copia vieja. | |
} | ||
vect2 operator-() const | -v2 | Menos de un solo lado (sin parámetro). Uno nuevo → const. |
{ | ||
return vect2(-x, -y); | Uno nuevo con los signos cambiados. | |
} | ||
| ||
// ---------- * ---------- | ||
vect2& operator*=(const vect2& o) | Extra: el main no lo usa. Multiplica componente a componente. | |
{ | ||
x *= o.x; | x por x. | |
y *= o.y; | y por y. | |
return *this; | Me devuelvo a mí. | |
} | ||
vect2 operator*(const vect2& o) const | Extra: el main no lo usa. | |
{ | ||
vect2 t(*this); | Una copia de mí: a mí no me toco. | |
return t *= o; | Multiplico la copia y la devuelvo. | |
} | ||
vect2& operator*=(int n) | multiplication by a scalarv1 *= 42; | Por un número (escalar). Me cambia y me devuelvo a mí. |
{ | ||
x *= n; | Cada componente por el número. | |
y *= n; | ||
return *this; | Me devuelvo a mí. | |
} | ||
vect2 operator*(int n) const | (vect2(2,2) * 2 == vect2(4,4))v3 *2 | v * 2: uno nuevo. Solo miro → const. |
{ | ||
vect2 t(*this); | Una copia de mí: a mí no me toco. | |
return t *= n; | Multiplico la copia y la devuelvo. | |
} | ||
friend vect2 operator*(int n, const vect2& v) | v2 = 3 * v2; | 3 * v: a la izquierda hay un int → no puede ser miembro. friend = función de fuera escrita aquí. |
{ | ||
return v * n; | Le doy la vuelta y uso v * n. | |
} | ||
| ||
// ---------- == != ---------- | ||
bool operator==(const vect2& o) const | (v1 == v3) | Sí/no → bool. Solo miro → const. |
{ | ||
return x == o.x && y == o.y; | Iguales si coinciden los dos. | |
} | ||
bool operator!=(const vect2& o) const | (v1 != v3) | Lo contrario de ==. |
{ | ||
return !(*this == o); | Reutilizo == y le doy la vuelta. | |
} | ||
| ||
// ---------- << ---------- | ||
friend std::ostream& operator<<(std::ostream& os, const vect2& v) | printable with the << operator | A la izquierda está cout, no un vect2 → friend. const vect2 & para poder imprimir v3. |
{ | ||
return os << "{" << v.x << ", " << v.y << "}"; | std::cout << "{" << v[0] << ", " << v[1] << "}" << std::endl; | El formato exacto del subject, en os. os << ... ya devuelve os. |
} | ||
}; |
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. |