Я не использую свой класс iterator так как в примере. Но мне нужно использовать мой класс подобно примеру : Пример:
#include <iostream>
#include <string>
using namespace std;
// клас дати 
class Date {
	int day; // день 
	int month; // місяць 
	int year; // рік 
public:
	// конструктор 
	Date(int dayl, int monthl, int yearl) {
		day = dayl; month = monthl; year = yearl;
	}
	// перевантажена операція введення з потоку 
	friend istream& operator>>(istream& is, Date& d) {
		is >> d.day >> d.month >> d.year; return is;
	}
	// перевантажена операція виведення у потік 
	friend ostream& operator<<(ostream& os, Date& d) {
		os << d.day << '.' << d.month << '.' << d.year << endl; return os;
	}
};
// клас з інформацією про продукцію підприємства 
class Product {
	Date d;
	string code;
	string name;
	int count;
	double price;
public:
	//конструктор 
	Product(Date dl = Date(1, 3, 2012),
		string codel = "",
		string namel = "",
		int countl = 0, double pricel = 0) :d(dl) {
		code = codel; name = namel; count = countl; price = pricel;
	}
	// метод читання дати 
	Date& getDate() { return d; }
	// метод читання коду 
	string& getCode() { return code; }
	// метод читання назви 
	string& getname() { return name; }
	// метод читання кількості 
	int& getCount() { return count; }
	// метод читання ціни 
	double& getPrice() { return price; }
	// перевантажена операція введення з потоку 
	friend istream& operator>>(istream& is, Product& t) {
		is >> t.d >> t.code >> t.name >> t.count >> t.price; return is;
	}
	// перевантажена операція виведення у потік 
	friend ostream& operator<<(ostream& os, Product& t) {
		os << t.d << ' ' << t.code << ' ' << t.name << ' ' << t.count << ' '
			<< t.price << endl;
		return os;
	}
};
#define T Product
//ітераторний клас 
class iter {
protected:
	T* i; // вказівник на елемент даних
public:
	//конструктор
	iter(T* il) : i(il) { }
	//конструктор копіювання
	iter(const iter& x) : i(x.i) { }
	//перевантажена операція присвоєння ітераторів 
	iter& operator=(const iter& x) {
		i = x.i;
		return *this;
	}
	// перевантажена операція розіменування ітератора 
	T& operator*() const {
		return *i;
	}
	// перевантажена операція префіксного інкременту ітератора 
	iter& operator++() {
		++i;
		return *this;
	}
	// перевантажена операція "не дорівнює"  для порівняння ітераторів
	bool operator!=(const iter& x) const {
		return i != x.i;
	}
	// перевантаженя операцій додавання та віднімання ітераторів
	//...
//...
//...
};
// клас складу виробів //контейер
class Storage {
	T* p; // вказівник на масив виробів
	int size; // кількість елементів масиву
public:
	// конструктор 
	Storage(int n = 1) {
		p = new T[size = n];
		for (iter i = begin(); i != end(); ++i) *i = T();
	}
	// конструктор копіювання 
	Storage(const Storage& a) {
		p = new T[size = a.size];
		for (iter i = begin(); i != end(); ++i) *i = a.p[i - begin()];
	}
	// деструктор 
	~Storage() { delete[]p; }
	// перевантажена операція присвоєння об'єктів 
	Storage& operator=(const Storage& a) {
		if (this != &a) {
			delete[]p;
			p = new T[size = a.size];
			for (iter i = begin(); i != end(); ++i) 
				*i = a.p[i - begin()];
		}
		return *this;
	}
	// перевантажена операція введення з потоку 
	friend istream& operator>>(istream& is, Storage& s) {
		for (iter i = s.begin(); i != s.end(); ++i)
			is >> *i;
		return is;
	}
	// перевантажена операція виведення у потік 
	friend ostream& operator<<(ostream& os, Storage& s) {
		for (iter i = s.begin(); i != s.end(); ++i)
			os << *i << '  ';
		os << endl;
		return os;
	}
	// метод обчислення вартості виробів заданого коду 
	double cost(string code) {
		double v = 0;
		for (iter i = begin(); i != end(); ++i)
			if ((*i).getCode() == code)
				v += (*i).getCount() * (*i).getPrice();
		return v;
	}
	// метод визначення значення ітератора перед масивом 
	iter begin() { return iter(p); }
	// метод визначення значення ітератора поза масивом 
	iter end() { return iter(p + size); }
	/////*****//////
	Storage& push_back(T x) {
		Storage temp = *this;
		delete[]p;
		p = new T[size += 1];
		int j = 0;
		for (iter i = begin(); i != end() - 1; ++i)
			*i = temp.p[i - begin()];
		iter i = end() - 1;
		*i = x;
		return *this;
	}
	Storage& push_front(T x) {
		Storage temp = *this;
		delete[]p;
		p = new T[size += 1];
		for (iter i = begin() + 1; i != end(); ++i)
			*i = temp.p[i - begin() - 1];
		iter i = begin();
		*i = x;
		return *this;
	}
	Storage& insert(T x, int pos) {
		Storage temp = *this;
		delete[]p;
		p = new T[size += 1];
		int j = 0;
		for (iter i = begin(); i != end() - pos; ++i)
		{
			*i = temp.p[j++];
		}
		iter i = begin() + pos;
		*i = x;
		j -= pos - 1;
		for (iter i = begin() + pos + 1; 
			i != end(); ++i)
		{
			*i = temp.p[j++];
		}
		return *this;
	}
	Storage& pop_back() {
		Storage temp = *this;
		delete[]p;
		p = new T[size -= 1];
		for (iter i = begin(); i != end(); ++i)
			*i = temp.p[i - begin()];
		return *this;
	}
	Storage& pop_front() {
		Storage temp = *this;
		delete[]p;
		p = new T[size -= 1];
		for (iter i = begin(); i != end(); ++i)
			*i = temp.p[i - begin() + 1];
		return *this;
	}
	Storage& erase(int pos) {
		Storage temp = *this;
		delete[]p;
		p = new T[size -= 1];
		int j = 0;
		for (iter i = begin(); i != end() - pos; ++i)
		{
			*i = temp.p[j++];
		}
		j -= pos - 1;
		for (iter i = begin() + pos; i != end(); ++i)
		{
			*i = temp.p[j++];
		}
		return *this;
	}
};
// головна функція 
void main() {
	//Ініціалізувати масив об'єктів класу за інд.завданням
	//...
	int n;
	cin >> n;
	Storage s(n);
	//Вивести зміст контейнеру
	//...
	//Додати новий елемент в кінець контейнеру
	//...
	//Вивести зміст контейнеру
	//...
	//Додати новий елемент на початок контейнеру
	//...
	//Вивести зміст контейнеру
	//...
	//Додати новий елемент у визначину позицію контейнеру
	//...
	//Вивести зміст контейнеру
	//...
	//Додати ще 2 рази любим з вищезастосованих методів
	//..
	//Вивести зміст контейнеру
	//...
	//Видалити останій елемент контейнеру
	//..
	//Вивести зміст контейнеру
	//...
	//Видалити перший елемент контейнеру
	//..
	//Вивести зміст контейнеру
	//...
	//Видалити елемент контейнеру з визначеної позиції
	//..
	//Вивести зміст контейнеру
	//...
}
Мой код:
#include <iostream>
#include <string>
using namespace std;
class Customer {
private:
    string surname;
    float priceBasicTariff;
    float priceSocialTariff;
    int countMonthsTariff;
public:
    Customer()
        : surname(""), priceBasicTariff(0.0f), priceSocialTariff(0.0f),
        countMonthsTariff(0) {
    }
    Customer(string s, float pBasic, float pSocial, int months)
        : surname(s), priceBasicTariff(pBasic), priceSocialTariff(pSocial),
        countMonthsTariff(months) {
    }
    Customer(const Customer& other)
        : surname(other.surname), priceBasicTariff(other.priceBasicTariff),
        priceSocialTariff(other.priceSocialTariff),
        countMonthsTariff(other.countMonthsTariff) {
    }
    ~Customer() {
    }
    void setSurname(const string& s) { surname = s; }
    void setPriceBasicTariff(float p) { priceBasicTariff = p; }
    void setPriceSocialTariff(float p) { priceSocialTariff = p; }
    void setCountMonthsTariff(int m) { countMonthsTariff = m; }
    const string& getSurname() const { return surname; }
    const float& getPriceBasicTariff() const { return priceBasicTariff; }
    const float& getPriceSocialTariff() const { return priceSocialTariff; }
    const int& getCountMonthsTariff() const { return countMonthsTariff; }
    void printInfo() const {
        cout << "Surname: " << surname << endl;
        cout << "Basic Tariff: " << priceBasicTariff << endl;
        cout << "Social Tariff: " << priceSocialTariff << endl;
        cout << "Months: " << countMonthsTariff << endl;
    }
    friend istream& operator>>(istream& is, Customer& c) {
        cout << "Enter surname: ";
        is >> c.surname;
        cout << "Enter basic tariff: ";
        is >> c.priceBasicTariff;
        cout << "Enter social tariff: ";
        is >> c.priceSocialTariff;
        cout << "Enter count of months: ";
        is >> c.countMonthsTariff;
        return is;
    }
    friend ostream& operator<<(ostream& os, const Customer& c) {
        os << "Surname: " << c.surname
            << ", Basic Tariff: " << c.priceBasicTariff
            << ", Social Tariff: " << c.priceSocialTariff
            << ", Months: " << c.countMonthsTariff;
        return os;
    }
};
class Iterator {
private:
    Customer* current;
public:
    Iterator(Customer* ptr = nullptr) : current(ptr) {}
    Customer& operator*() const {
        return *current;
    }
    Customer* operator->() const {
        return current;
    }
    Iterator& operator++() {
        ++current;
        return *this;
    }
    Iterator operator++(int) {
        Iterator temp = *this;
        ++current;
        return temp;
    }
    bool operator!=(const Iterator& other) const {
        return current != other.current;
    }
    bool operator==(const Iterator& other) const {
        return current == other.current;
    }
};
class Storage {
private:
    Customer* p;
    int size;
public:
    Storage(int n = 0) : size(n) {
        if (size > 0) {
            p = new Customer[size];
            for (int i = 0; i < size; ++i) {
                p[i] = Customer();
            }
        }
        else {
            p = nullptr;
        }
    }
    Storage(const Storage& other) : size(other.size) {
        if (size > 0) {
            p = new Customer[size];
            for (int i = 0; i < size; ++i) {
                p[i] = other.p[i];
            }
        }
        else {
            p = nullptr;
        }
    }
    ~Storage() {
        delete[] p;
    }
    Storage& operator=(const Storage& other) {
        if (this != &other) {
            delete[] p;
            size = other.size;
            if (size > 0) {
                p = new Customer[size];
                for (int i = 0; i < size; ++i) {
                    p[i] = other.p[i];
                }
            }
            else {
                p = nullptr;
            }
        }
        return *this;
    }
    friend istream& operator>>(istream& is, Storage& s) {
        for (int i = 0; i < s.size; ++i) {
            cout << "Entering data for Customer " << i + 1 << ":" << endl;
            is >> s.p[i];
        }
        return is;
    }
    friend ostream& operator<<(ostream& os, const Storage& s) {
        os << "Storage contains " << s.size << " Customers:" << endl;
        for (int i = 0; i < s.size; ++i) {
            os << i + 1 << ". " << s.p[i] << endl;
        }
        return os;
    }
    Iterator begin() const { return Iterator(p); }
    Iterator end() const { return Iterator(p + size); }
    void push_back(const Customer& x) {
        Customer* new_p = new Customer[size + 1];
        for (int i = 0; i < size; ++i) {
            new_p[i] = p[i];
        }
        new_p[size] = x;
        delete[] p;
        p = new_p;
        ++size;
    }
    void push_front(const Customer& x) {
        Customer* new_p = new Customer[size + 1];
        new_p[0] = x;
        for (int i = 0; i < size; ++i) {
            new_p[i + 1] = p[i];
        }
        delete[] p;
        p = new_p;
        ++size;
    }
    void insert(const Customer& x, int pos) {
        if (pos < 0 || pos > size) {
            cout << "Invalid position for insert." << endl;
            return;
        }
        Customer* new_p = new Customer[size + 1];
        for (int i = 0; i < pos; ++i) {
            new_p[i] = p[i];
        }
        new_p[pos] = x;
        for (int i = pos; i < size; ++i) {
            new_p[i + 1] = p[i];
        }
        delete[] p;
        p = new_p;
        ++size;
    }
    void pop_back() {
        if (size == 0) {
            cout << "Storage is already empty. Cannot pop_back." << endl;
            return;
        }
        Customer* new_p = nullptr;
        if (size - 1 > 0) {
            new_p = new Customer[size - 1];
            for (int i = 0; i < size - 1; ++i) {
                new_p[i] = p[i];
            }
        }
        delete[] p;
        p = new_p;
        --size;
    }
    void pop_front() {
        if (size == 0) {
            cout << "Storage is already empty. Cannot pop_front." << endl;
            return;
        }
        Customer* new_p = nullptr;
        if (size - 1 > 0) {
            new_p = new Customer[size - 1];
            for (int i = 1; i < size; ++i) {
                new_p[i - 1] = p[i];
            }
        }
        delete[] p;
        p = new_p;
        --size;
    }
    void erase(int pos) {
        if (pos < 0 || pos >= size) {
            cout << "Invalid position for erase." << endl;
            return;
        }
        if (size == 0) {
            cout << "Storage is empty. Cannot erase." << endl;
            return;
        }
        Customer* new_p = nullptr;
        if (size - 1 > 0) {
            new_p = new Customer[size - 1];
            for (int i = 0; i < pos; ++i) {
                new_p[i] = p[i];
            }
            for (int i = pos + 1; i < size; ++i) {
                new_p[i - 1] = p[i];
            }
        }
        delete[] p;
        p = new_p;
        --size;
    }
    void copyFrom(const Storage& other) {
        if (this == &other)
            return;
        delete[] p;
        size = other.size;
        if (size > 0) {
            p = new Customer[size];
            for (int i = 0; i < size; ++i) {
                p[i] = other.p[i];
            }
        }
        else {
            p = nullptr;
        }
    }
    int getSize() const { return size; }
};
void displayMenu() {
    cout << "\n--- Storage Menu ---\n";
    cout << "1. Input Customers\n";
    cout << "2. Display Customers\n";
    cout << "3. Add Customer to Back (push_back)\n";
    cout << "4. Add Customer to Front (push_front)\n";
    cout << "5. Insert Customer at Position (insert)\n";
    cout << "6. Remove Last Customer (pop_back)\n";
    cout << "7. Remove First Customer (pop_front)\n";
    cout << "8. Erase Customer at Position (erase)\n";
    cout << "9. Copy Storage to Another Storage\n";
    cout << "0. Exit\n";
    cout << "Choose an option: ";
}
int main() {
    Storage s;
    Storage sCopy;
    int choice;
    do {
        displayMenu();
        cin >> choice;
        switch (choice) {
        case 1: {
            int n;
            cout << "Enter number of Customers to input: ";
            cin >> n;
            for (int i = 0; i < n; ++i) {
                Customer c;
                cin >> c;
                s.push_back(c);
            }
            break;
        }
        case 2: {
            cout << s;
            break;
        }
        case 3: {
            Customer c;
            cout << "Enter details for Customer to add to back:" << endl;
            cin >> c;
            s.push_back(c);
            break;
        }
        case 4: {
            Customer c;
            cout << "Enter details for Customer to add to front:" << endl;
            cin >> c;
            s.push_front(c);
            break;
        }
        case 5: {
            int pos;
            cout << "Enter position to insert (0-based index): ";
            cin >> pos;
            if (pos < 0 || pos > s.getSize()) {
                cout << "Invalid position." << endl;
                break;
            }
            Customer c;
            cout << "Enter details for Customer to insert at position " << pos << ":" << endl;
            cin >> c;
            s.insert(c, pos);
            break;
        }
        case 6: {
            s.pop_back();
            cout << "Last Customer removed." << endl;
            break;
        }
        case 7: {
            s.pop_front();
            cout << "First Customer removed." << endl;
            break;
        }
        case 8: {
            int pos;
            cout << "Enter position to erase (0-based index): ";
            cin >> pos;
            if (pos < 0 || pos >= s.getSize()) {
                cout << "Invalid position." << endl;
                break;
            }
            s.erase(pos);
            cout << "Customer at position " << pos << " erased." << endl;
            break;
        }
        case 9: {
            sCopy.copyFrom(s);
            cout << "Storage copied to another Storage object." << endl;
            cout << "Copied Storage content:" << endl;
            cout << sCopy;
            break;
        }
        case 0: {
            cout << "Exiting program." << endl;
            break;
        }
        default:
            cout << "Invalid choice. Please try again." << endl;
        }
    } while (choice != 0);
    return 0;
}