Noch eine andere Sache:
Du solltest unbedingt Zuständigkeiten trennen.
Die Lese-/Schreibfunktionalität sollte keine Eigenschaft der Liste sein, sondern als freie Funktion implementiert werden. Wenn irgendwann zB neue Formate dazukommen (INI, XML, JSON, Binary, etc) kannst du das bequem ergänzen, ansonsten blähst du deine Liste unnötig auf. Gilt natürlich auch für das Lesen aus eine CSV-Datei.
Das gleiche gilt für die Anzeige. Die Liste selbst sollte sich nicht um die Anzeige kümmern, sondern irgendwas sollte die Liste anzeigen.
Wozu der Index benutzt wird habe ich nicht verstanden, und damit auch nicht operator++, operator--, PlusZehn und MinusZehn.
Wenn du das so umsetzt, wie gerade vorgeschlagen, sähe das Ganze so aus:
struct PC
{
unsigned int Herstellernummer = 0;
unsigned int Leistung = 0;
unsigned int Gewicht = 0;
std::string Firma;
std::string Name;
std::string Farbe;
std::string Betriebssystem;
PC() = default;
}
Die "Liste" aus PCs ist einfach nur std::vector<PC>, und fertig.
// Lese- und Schreibfunktionalität
// Lesen und Schreiben im "Default"- Format
std::istream& operator>>( istream& is, std::vector<PC>& collection );
std::ostream& operator<<( ostream& os, std::vector<PC> const& collection );
// Lesen/Schreiben anderer Formate, naiver Ansatz
std::vector<PC> read_from_csv( std::string const& filename );
void write_to_csv( std::string const& filename , std::vector<PC> const& collection );
std::vector<PC> read_from_xml( std::string const& filename );
void write_to_xml( std::string const& filename , std::vector<PC> const& collection );
// Anzeigefunktionen
void show_pc( PC const& pc ); // von mir aus auch einfach nur show, die richtige Überladung
void show_list( std::vector<PC> const& collection ); // wird durch wird durch den Parameter benutzt
Zurück zum Index:
Die Liste ist nicht dafür verantwortlich sich zu merken, welches Element gerade aktuell ist, das muss im eigenen Kontext irgendwo anders passieren.
Edit:
const correctness ist auch ein Thema, mit du dich beschäftigen solltest.