C ++打印元素,包含来自对象数组的数据

时间:2016-12-15 01:06:08

标签: c++ arrays

我目前正在使用c ++中的对象数组。我有一个Book对象数组,里面填充了数据文件中的数据,我需要循环遍历Book对象数组并打印每个包含book数据的元素,每行一个。当我打印出来时,列表中的项目为“空”,没有标题,没有ISBN,价格为0,数量为0.如何才能将其打印出包含数据的元素?< / p>

1 个答案:

答案 0 :(得分:0)

您可以使用基于范围的for循环并检查书对象是否为空:

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

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

正如@Barmar所说,如果你使用std::vector并且只知道它不是一个空对象时只添加一个新的Book会更好 - 那么你有一个有效的书籍容器你可以放弃isEmpty()支票。

如果你的Book对象没有一种非常直接的内部方式来知道它是否为空,而不是在界面中添加isEmpty()成员函数,那么最好有一个非会员非朋友便利功能,以检查图书是否为空:

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();
}

(这是一个人为的例子 - 如果一本书的标题为空,可以合理地假设一本书是空的。)

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

更高级的技术是将isEmpty(Book)便利函数放入与Book对象相同的名称空间中。但这对小型项目来说并不重要。

(98%的帖子来自Scott Meyer的Effective C ++ 3rd Edition,ISBN 0-321-33487-6,价格£n / a,数量1)