2016-12-15 3 views
-2

Ich arbeite derzeit mit Objekt-Arrays in C++. Ich habe ein Buch-Objekt-Array, das mit Daten aus einer Datendatei gefüllt ist, und ich muss das Array von Buch-Objekten durchlaufen und jedes der Elemente drucken, die Buchdaten enthalten, eines pro Zeile. Wenn ich es ausdrucke, gibt es Elemente in der Liste, die "leer" sind, ohne Titel, keine ISBN, einen Preis von 0 und eine Menge von 0. Wie kann ich erreichen, dass nur die Elemente gedruckt werden, die Daten enthalten?C++ Druckelemente mit Daten aus Objekt-Array

+1

Verwenden Sie ein 'if()' Erklärung Überprüfen Sie, ob das Objekt Werte hat. – Barmar

+0

Warum verwenden Sie nicht 'std :: vector', so dass Sie nur gültige Bücher in den Vektor einfügen? – Barmar

+2

Hallo, willkommen zu Stack Overflow. Es wäre großartig, wenn Sie ein [mcve] bereitstellen könnten, damit wir und zukünftige Benutzer genau sehen können, was Sie meinen, anstatt nur eine Beschreibung zu lesen! –

Antwort

0

Sie eine bereichsbasierte for Schleife mit einem Häkchen, wenn das Buch Objekt leer ist zu sehen, benutzen könnte:

Book books[255]; 
// or 
std::vector<Book> books; 

for(const auto& book : books) { 
    if(!book.isEmpty()) { 
    std::cout << book.print() << std::endl; 
    } 
} 

Wie @Barmar sagte, es wäre besser, wenn Sie einen std::vector verwenden und nur hinzufügen eine neue Book, wenn Sie wissen, dass es kein leeres Objekt ist - dann haben Sie einen Container mit gültigen Büchern und Sie können auf die isEmpty() Prüfung verzichten.

Wenn Ihr Book Objekt nicht wirklich einfach zu wissen, interne Weise muss, wenn es leer ist oder nicht, anstatt das Hinzufügen einer isEmpty() Member-Funktion in die Schnittstelle, ist es besser, einen Nichtmitglied Nicht-Freund Komfort Funktion zu überprüfen, ob das Buch ist leer:

class Book { 
public: 
    std::string title() const; 
    std::string author() const; 
    std::string isbn() const; 
    // simpler is better... it's already getting cluttered... 
    ... 
}; 

// you don't need to be a member of Book to know if a Book is empty! 
bool isEmpty(const Book& book) { 
    return book.title().empty() && book.author().empty() && book.isbn().empty(); 
} 

(das ist ein bisschen wie ein konstruiertes Beispiel - es könnte vernünftigerweise angenommen wird, dass ein Buch leer ist, wenn der Titel leer ist.)

for(const auto& book : books) { 
    if(!isEmpty(book)) { 
    std::cout << book.print() << std::endl; 
    } 
} 

Eine fortgeschrittenere Technik wäre, die isEmpty(Book) Convenience-Funktion in denselben Namespace wie das Book-Objekt zu setzen. Aber das dürfte bei kleinen Projekten nicht wichtig sein.

(98% dieses Beitrags wird von Scott Meyers Effective C++ erbrochen 3rd Edition, ISBN 0-321-33487-6, Preis £ n/a, Menge 1)