问答题 试题五 阅读下列说明和C++代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 【说明】 某图书管理系统中管理着两种类型的文献:图书和论文。现在要求统计所有馆藏文献的总页码(假设图书馆中有一本540页的图书和两篇各25页的论文,那么馆藏文献的总页码就是590页)。采用Visitor(访问者)模式实现该要求,得到如图5-1所示的类图。 [*] 【C++代码】 class LibraryVisitor; class LibraryItemInterface{ public: (1) : }; class Article : public LibraryItemInterface { private: string m_title; //论文名 string m_author; //论文作者 int m_start_page; int m_end_page; public: Article(string p_author, string p_title, int p_start_page,int p_end_page ); int getNumber()fPages(); void accept(Library Visitor* visitor); }; class Book : public LibraryItemInterface { private: string m_title; //书名 string m_author; //作者 int m_pages; //页数 public: Book(string p_author, string p_title, int p_pages); int getNumber()fPages(); void accept(LibraryVisitor* visitor); }; class LibraryVisitor { public: (2) ; ( 3) ; virtual void printSum() = 0; }; class LibrarySumPrintVisitor : public LibraryVisitor { //打印总页数 private: int sum; public: LibrarySumPrintVisitor(); void visit(Book* p_book); void visit(Article* p_article); void printSum(); }; // visitor.cpp int Article: :getNumber()fPages(){ retum m_end_page - m_start_page; } void Article::accept(LibraryVisitor* visitor) { (4) ;} Book: :Book(string p_author, string p_title, int p_pages ) { m_title = p_title; m_author = p_author; m_pages = p_pages; } int Book::getNumberOfPages(){ return m_pages; } void Book::accept(LibraryVisitor* visitor){ (5) ; } //其余代码省略问题:5.1 (15分) 阅读上述说明和C++代码,将应填入 (n) 处的字句写在答题纸的对应栏内。
【正确答案】(1)virtual void accept(LibraryVisitor*visitor)=0 (2)virtual void visit(Book* p_book)=0 (3)virtual void visit(Article* p_article)=0 (4)visitor->visit(this) (5)visitor->visit(this)
【答案解析】本题考查Visitor (访问者)模式的基本概念和应用。 访问者模式是行为设计模式中的一种。行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。这些模式刻画了在运行时难以跟踪的复杂的控制流。 访问者模式表示一个作用于某对象结构中的各元素的操作。它使在不改变各元素的类的前提下可以定义作用于这些元素的新操作。此模式的结构图如下图所示。