朋友功能不起作用(语法错误)

时间:2018-04-01 09:39:51

标签: c++ friend-function

我是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)

1 个答案:

答案 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关键字。已经照顾好了。