// Error: un arreglo de cadenas que libera el bloque viejo antes de leer el argumento.
#include <cstddef>
#include <iostream>
#include <string>
#include <utility>

class Names {
public:
    ~Names() { delete[] data_; }
    Names() = default;
    Names(const Names&) = delete;
    Names& operator=(const Names&) = delete;

    std::string& operator[](std::size_t i) { return data_[i]; }

    void push_back(const std::string& value) {
        if (size_ == capacity_) {
            std::size_t bigger = capacity_ == 0 ? 1 : 2 * capacity_;
            std::string* fresh = new std::string[bigger];
            for (std::size_t i = 0; i < size_; i++) {
                fresh[i] = std::move(data_[i]);
            }
            delete[] data_;
            data_ = fresh;
            capacity_ = bigger;
        }
        data_[size_] = value;
        size_++;
    }

private:
    std::string* data_ = nullptr;
    std::size_t size_ = 0;
    std::size_t capacity_ = 0;
};

int main() {
    Names names;
    names.push_back("Quispe");
    names.push_back(names[0]);
    std::cout << names[1] << "\n";
    return 0;
}
