【发布时间】:2018-04-01 09:39:51
【问题描述】:
我是 C++ 新手,以前从未实现过友元函数。但是我得到了一个特定的朋友函数来实现,如下std::ostream &operator << (std::ostream &out, const Library &lib);。我认为这应该放在 Library 类的头文件中,但由于某种原因,ostream、out 和 lib 都会引发语法错误。我也不太明白什么是试图成为基于这行代码的朋友。抱歉我的问题含糊不清,但我对朋友功能真的不太了解。任何帮助将不胜感激,谢谢。
图书馆.h
#include <iostream>
#ifndef ASS1_LIBRARY_H
#define ASS1_LIBRARY_H
class Library {
private:
static const int MAX = 10;
std::string BookList[MAX];
std::string libraryName;
int length;
public:
explicit Library(const std::string &name);
// Add a new book,
// return true for success, false if book already in library
bool AddBook(const std::string &name);
// Remove a book
// return true for success, false if book not in library
bool RemoveBook(const std::string &name);
// List all books in library
void ListAllBooks() const;
// Return true if book in library, false otherwise
bool IsInLibrary(const std::string &name) const;
std::string getLibraryName();
};
//friend function
std::ostream &operator << (std::ostream &out, const Library &lib);
#endif //ASS1_LIBRARY_H
库.cpp
#include <iostream>
#include "Library.h"
using namespace std;
Library::Library(const string &name) {
libraryName = name;
length = 0;
}
bool Library::AddBook(const string &name) {
if(IsInLibrary(name) || length >= MAX) {
return false;
}
else {
length++;
BookList[length - 1] = name;
return true;
}
}
bool Library::RemoveBook(const std::string &name) {
int counter = 0;
while(counter < length) {
if(BookList[counter] == name) {
BookList[counter] = "";
length--;
while(counter < length) {
BookList[counter] = BookList[counter + 1];
BookList[counter + 1] = "";
counter++;
}
return true;
}
counter++;
}
return false;
}
void Library::ListAllBooks() const {
int counter = 0;
while(counter < length) {
cout << BookList[counter];
if(counter != length - 1) {
cout << "," << endl;
}
counter++;
}
cout << endl;
}
bool Library::IsInLibrary(const std::string &name) const {
int counter = 0;
while(counter < length) {
if(BookList[counter] == name) {
return true;
}
counter++;
}
return false;
}
string Library::getLibraryName() {
return libraryName;
}
main.cpp
#include <iostream>
#include "Library.h"
int main() {
Library execute("MyLibrary");
execute.AddBook("Book 1");
execute.AddBook("Book 2");
execute.AddBook("Book 3");
execute.AddBook("Book 4");
execute.AddBook("Book 5");
execute.AddBook("Book 6");
execute.AddBook("Book 7");
execute.AddBook("Book 8");
execute.AddBook("Book 9");
execute.AddBook("Book 10");
execute.RemoveBook("Book 3");
execute.RemoveBook("Book 5");
execute.RemoveBook("Book 10");
execute.RemoveBook("B");
execute.ListAllBooks();
std::cout << execute.getLibraryName() << std::endl;
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.9)
project(ass1)
set(CMAKE_CXX_STANDARD 14)
add_executable(ass1 main.cpp Library.cpp Library.h)
【问题讨论】:
-
让我们问鸭子。
-
您实际上并没有在您的
Library类中告诉朋友函数存在。 -
编译器不理解 cmets。
-
FWIW,一个常见的习惯用法是在标题内定义
operator<<(ostream & out, const Foo & obj)朋友函数,可能是inline-qualified 并且只是{ obj.print(out); return out; }。在常规的print方法中进行实际工作。
标签: c++ friend-function