链接

时间:2015-07-20 23:48:47

标签: c++ class

我仍然是C ++的新手,我在创建一个类文件并将其链接到我的主程序和实现文件时遇到了麻烦。

这是我的规范文件:

#ifndef BOOKCLASS_H
#define BOOKCLASS_H
#include<string>

using namespace std;

class Book
{
    private:
        string title;       //A string that holds the book’s title
        string author;      //A string that holds the book’s author
        string publisher;   //A string that holds the book’s publisher
        string isbn;        //A string that holds the book’s ISBN number
        double price;       //A double that holds the book’s price
        int year;           //An int that holds the year when the book was published
        int numInStock;     //An int that holds the number of copies of this book
    public:
        Book();                     //constuctor ---- will be overwritten by storeBook if getBookInfo operates properly
        void getBookInfo(Book &);   //gets the information for the book and calls storeBook within to store information to the variables
        void storeBook(string bookTitle, string authorName, string bookPublisher, string bookISBN, double bookPrice, int bookYear, int booksInStock);
        void displayBookInfo();     //Displays the contents of the BookClass member variables
        void checkOutBook();        //Subtracts 1 from the numInStock member variable, tests to make sure numInStock is not 0
        void returnBook()           //Adds 1 to the numInStock member variable
        { numInStock++; };
        string getTitle()           //Returns the value in title
        { return title; };
        int getNumInStock()         //Returns the value in numInStock
        { return numInStock; };
};
#endif // !BOOKCLASS_H

这是实施文件:

#include<iostream>
#include<string>
#include"BookClass.h"

using namespace std;


//*********************************************************************************************************************************************************************
//constuctor - this constuctor will assign generic values to the class, used primarily for troubleshooting and will be overwritten if program operates properly
//*********************************************************************************************************************************************************************
Book::Book()
{
    std::cout << "Made it into the constructor!\n\n";
    title = "Empty";
    author = "Empty";
    publisher = "Empty";
    isbn = "Empty";
    price = 0.00;
    year = 0000;
    numInStock = 0;
}

//*********************************************************************************************************************************************************************
//Asks the user to enter information for one book, then invokes member function storeBook to store the information in the BookClass variable.
//*********************************************************************************************************************************************************************
void Book::getBookInfo(Book &book)
{
    string bookTitle, authorName, bookPublisher, bookISBN;
    double bookPrice;
    int bookYear, booksInStock;

    cout << "Enter the book title: ";
    getline(cin, bookTitle);
    cout << "Enter the author: ";
    getline(cin, authorName);
    cout << "Enter the publisher: ";
    getline(cin, bookPublisher);
    cout << "Enter the ISBN-10 including dashes(ex. 0-00-000000-0): ";
    getline(cin, bookISBN);
    cout << "Enter the price: ";
    cin >> bookPrice;
    cout << "Enter the year: ";
    cin >> bookYear;
    cout << "Enter the quantity in stock: ";
    cin >> booksInStock;
    Book::storeBook(bookTitle, authorName, bookPublisher, bookISBN, bookPrice, bookYear, booksInStock);
}

//*********************************************************************************************************************************************************************
//Stores the values taken from the user input into the class variables
//*********************************************************************************************************************************************************************
void Book::storeBook(string bookTitle, string authorName, string bookPublisher, string bookISBN, double bookPrice, int bookYear, int booksInStock)
{
    title = bookTitle;
    author = authorName;
    publisher = bookPublisher;
    isbn = bookISBN;
    price = bookPrice;
    year = bookYear;
    numInStock = booksInStock;
}

//*********************************************************************************************************************************************************************
//Displays the contents of the BookClass member variables
//*********************************************************************************************************************************************************************
void Book::displayBookInfo()
{
    cout << "Title: "
         << title
         << "\nAuthor: "
         << author 
         << "\nPublisher: "
         << publisher
         << "\nISBN-10: "
         << isbn
         << "\nPrice: "
         << price
         << "\nYear: "
         << year
         << "\nQuantity in stock: "
         << numInStock;
}

//*********************************************************************************************************************************************************************
//Subtracts 1 from the numInStock member variable, tests to make sure numInStock is not 0
//*********************************************************************************************************************************************************************
void Book::checkOutBook()
{
    if(numInStock <= 0)
    {
        cout << "ERROR: All copies are checked out. Please select another title.\n";
        return;
    }
    else
        numInStock--;
}

最后我的主要计划:

#include"BookClass.h"
#include"BookMain.cpp"

using namespace std;

int main()
{
    Book book1;
    cout << "Before getBookInfo\n";
    getBookInfo(book1);
    cout << "\nAfter getBookInfo\n";

    system("pause");
    return 0;
}

我确信我不需要在每个文件中包含字符串类,但如果我没有收到更多错误。当我尝试运行它时,我得到编译器错误说明:

错误C2352:&#39; Book :: storeBook&#39; :非静态成员函数的非法调用

当我注释掉它的调用时(实现文件的第38行)并再次运行,看看我是否可以进入getBookInfo函数,我得到了这个:

1&gt; Library Test Function.obj:错误LNK2005:&#34; public:void __thiscall Book :: checkOutBook(void)&#34; (?checkOutBook @ Book @@ QAEXXZ)已在BookMain.obj中定义

1&gt; Library Test Function.obj:错误LNK2005:&#34; public:void __thiscall Book :: displayBookInfo(void)&#34; (?displayBookInfo @ Book @@ QAEXXZ)已在BookMain.obj中定义

1&gt; Library Test Function.obj:错误LNK2005:&#34; void __cdecl getBookInfo(class Book&amp;)&#34; (?getBookInfo @@ YAXAAVBook @@@ Z)已在BookMain.obj中定义

1&gt; Library Test Function.obj:错误LNK2005:&#34; public:void __thiscall Book :: storeBook(class std :: basic_string,class std :: allocator&gt;,class std :: basic_string,class std: :allocator&gt;,class std :: basic_string,class std :: allocator&gt;,class std :: basic_string,class std :: allocator&gt;,double,int,int)&#34; (?storeBook @ Book @@ QAEXV?$ basic_string @ DU?$ char_traits @ D @ std @@ V?$ allocator @ D @ 2 @@ std @@ 000NHH @ Z)已在BookMain.obj中定义

我知道传入getBookInfo函数的引用变量没有被使用(老师希望函数传递该参数),主要是因为我不知道该如何处理它,但我不知道&#39 ;看到这是我的错误的问题。有人可以告诉我我做错了什么吗?这是赋值的一部分,包括getBookInfo函数的格式,我应该将它与实现文件的其余部分分开吗?

  

会员职能
      •void storeBook(string bookTitle,string authorName,string bookPublisher,string bookISBN,double bookPrice,int bookYear,int booksInStock)
          o将参数存储到BookClass成员变量中       •void displayBookInfo()显示BookClass成员变量的内容       •void checkOutBook()从numInStock成员变量中减去1;测试以确保numInStock不是0
      •void returnBook()向numInStock成员变量添加1       •string getTitle()返回标题
中的值       •int getNumInStock()返回numInStock中的值       2.创建BookMain.cpp以测试您的BookClass       功能:
      •void getBookInfo(BookClass&amp;);
          o要求用户输入一本书的信息,然后调用成员函数       storeBook将信息存储在BookClass变量中       使用主程序测试您的课程和功能:

提前感谢您的任何建议!

3 个答案:

答案 0 :(得分:4)

Book::storeBook()是一个成员函数。它不是静态函数,所以这是错误的:

Book::storeBook(bookTitle, authorName, bookPublisher, bookISBN, bookPrice, bookYear, booksInStock);

可以更改为book.storeBook(...)

不要#include"BookMain.cpp"。这导致您的链接错误。你很可能需要清理和重建。

答案 1 :(得分:2)

此代码调用storeBook(),就好像它是一个静态方法:

class Book {
    ...
    void storeBook(...)

但该方法实际上是非静态的:

book.storeBook(...)

这会导致您的错误。知道正确的解决方案有点棘手。该方法应该是静态的吗?如果该方法在现有的Book实例上运行,那么它应该是非静态的,并且您想要像这样调用它:

{{1}}

这将调用传递给getBookInfo函数的Book实例上的storeBook方法作为&#34; book&#34;。

根据您对问题的描述,我认为这就是您想要的。

答案 2 :(得分:0)

包括&#34; BookClass.h&#34;在你的main.cpp文件和BookClass.cpp中。然后一起编译。我们假设您正在使用g ++

g++ -std=c++11 BookClass.cpp main.cpp -o file.out

不要在main.cpp文件中包含cpp文件,也不要在头文件中包含std命名空间。请改用完全限定的路径 - &gt;的std ::任何