我是C ++的新手,我之前从未实现过朋友功能。但我已经获得了一个特定的朋友函数来实现,如下std::ostream &operator << (std::ostream &out, const Library &lib);
。我假设这应该放在Library类的头文件中,但由于某种原因,ostream,out和lib都会引发语法错误。我也真的不明白什么是基于这行代码的朋友。很抱歉我的问题模糊不清,但我真的不太了解朋友的功能。任何帮助将不胜感激,谢谢。
Library.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
Library.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)
答案 0 :(得分:1)
您正在尝试将该函数作为该类的朋友,以便它可以访问该类的私有成员。
要做到这一点,必须在类本身的定义中将该函数声明为朋友。 (班级可以选择朋友。)
所以你需要将它放在class Library { };
:
friend std::ostream &operator << (std::ostream &out, const Library &lib);
然后你有两个选择。实际上,您可以在类定义中内联定义函数。
或者,更接近您所拥有的样式,您可以在Library.cpp中定义它:
std::ostream &operator << (std::ostream &out, const Library &lib) {
return out << lib.something << ....;
}
请注意,您不需要 - 实际上也不能 - 使用friend
关键字。已经照顾好了。