-1

编辑

这是我的新代码:

class LibItem
{
public:
    //LibItem();
    //LibItem(string setItemTitle, string setItemAuthor, string setItemReleaseDate, string setItemCopyright, string setItemGenre, string setItemStatus)
    //{
    //  Title = setItemTitle;
    //  Author = setItemAuthor;
    //  ReleaseDate = setItemReleaseDate;
    //  Copyright = setItemCopyright;
    //  Genre = setItemGenre;
    //  Status = setItemStatus;
    //}
    //~LibItem(); //DO ******************
    virtual void PrintDetails() = 0;
    void setDetails(string setItemTitle, string setItemAuthor, string setItemReleaseDate, string setItemCopyright, string setItemGenre, string setItemStatus)
    {
        Title = setItemTitle;
        Author = setItemAuthor;
        ReleaseDate = setItemReleaseDate;
        Copyright = setItemCopyright;
        Genre = setItemGenre;
        Status = setItemStatus;
    }
    void setTitle(string TitleName)
    {
        Title = TitleName;
    }
    string getTitle()
    {
        return Title;
    }
    void setReleaseDate(string date)
    {
        ReleaseDate = date;
    }
    string getReleaseDate()
    {
        return ReleaseDate;
    }
    void setAuthor(string AuthorName)
    {
        Author = AuthorName;
    }
    string getAuthor()
    {
        return Author;
    }
    void setCopyright(string CopyrightDetails)
    {
        Copyright = CopyrightDetails;
    }
    string getCopyright()
    {
        return Copyright;
    }
    void setGenre(string GenreDetails)
    {
        Genre = GenreDetails;
    }
    string getGenre()
    {
        return Genre;
    }
    void setStatus(string StatusDetails)
    {
        Status = StatusDetails;
    }
    string getStatus()
    {
        return Status;
    }
private:
    string Title;
    string ReleaseDate;
    string Author;
    string Copyright;
    string Genre;
    string Status;
};

class Book : public LibItem
{
public:
    Book(string setItemTitle, string setItemAuthor, string setItemReleaseDate, string setItemCopyright, string setItemGenre, string setItemStatus, string setItemISBN)
    {
        setDetails(setItemTitle, setItemAuthor, setItemReleaseDate, setItemCopyright, setItemGenre, setItemStatus);
        setISBN(setItemISBN);
    }
    void setISBN(string ISBNDetails)
    {
        ISBN = ISBNDetails;
    }
    string getISBN()
    {
        return ISBN;
    }
    void PrintDetails()
    {
        cout << "Title: " << getTitle() << endl;
        cout << "Author: " << getAuthor() << endl;
        cout << "Release Date: " << getReleaseDate() << endl;
        cout << "Copyrite: " << getCopyright() << endl;
        cout << "Genre: " << getGenre() << endl;
        cout << "Status: " << getStatus() << endl;
        cout << "ISBN: " << getISBN() << endl;
    }

private:
    Book();
    string ISBN;

};

class DVD : public LibItem
{
public:
    DVD(string setItemTitle, string setItemAuthor, string setItemReleaseDate, string setItemCopyright, string setItemGenre, string setItemStatus, int setItemRunningTime, string setItemDirector, string setItemStudio, string setItemProducer)
    {
        setDetails(setItemTitle, setItemAuthor, setItemReleaseDate, setItemCopyright, setItemGenre, setItemStatus);
        setRunningTime(setItemRunningTime);
        setDirector(setItemDirector);
        setStudio(setItemStudio);
        setProducer(setItemProducer);
    }
    void setRunningTime(int RunningTimeDetails)
    {
        RunningTime = RunningTimeDetails;
    }
    int getRunningTime()
    {
        return RunningTime;
    }
    void setDirector(string DirectorDetails)
    {
        Director = DirectorDetails;
    }
    string getDirector()
    {
        return Director;
    }
    void setStudio(string StudioDetails)
    {
        Studio = StudioDetails;
    }
    string getStudio()
    {
        return Studio;
    }
    void setProducer(string ProducerDetails)
    {
        Producer = ProducerDetails;
    }
    string getProducer()
    {
        return Producer;
    }
    void PrintDetails()
    {
        cout << "Title: " << getTitle() << endl;
        cout << "Author: " << getAuthor() << endl;
        cout << "Release Date: " << getReleaseDate() << endl;
        cout << "Copyrite: " << getCopyright() << endl;
        cout << "Genre: " << getGenre() << endl;
        cout << "Status: " << getStatus() << endl;
        cout << "Running Time: " << getRunningTime() << endl;
        cout << "Director: " << getDirector() << endl;
        cout << "Studio: " << getStudio() << endl;
        cout << "Producer: " << getProducer() << endl;
    }

private:
    DVD();
    int RunningTime;
    string Director;
    string Studio;
    string Producer;

};

这是我使用上述类的代码:

LibItem *test;
test = new DVD("TestDVD","Test Author","01-01-2012","TestCopyright","TestGenre","TestStatus","120","TestDirector","TestStudio","TestProducer");
test->PrintDetails();

我收到此错误:

[BCC32 错误] 问题 5.cpp(200): E2285 找不到匹配 'DVD::DVD(const char *,const char *,const char *,const char *,const char *,const char *,const char *,const char *,const char *,const char *)'

我能否提供一些有关为什么会发生此错误以及如何修复它的信息?

4

3 回答 3

0

为什么是这样?

您刚刚为您的类声明了一个构造函数LibItem(),但没有定义它。自然,链接器找不到它并抱怨相同。
您还需要定义它。

LibItem()::LibItem()
{
}

析构函数也是如此。
请注意,如果您没有为您的类显式声明构造函数或析构函数,则编译器会隐式生成它们的定义,但如果您显式声明它们,则为它们提供定义的责任是您的。

有人可以向我解释如何在两个单独的文件中实现这些类

通常,在 C++ 中,类定义放在头文件 (.h/.hpp) 中,而成员函数的定义放在源文件 (.cpp/.cc) 中。使用范围解析运算符允许您这样做。

一个例子:

//Myclass.h

class Myclass
{
    public:
       void doSomething();
};

//Myclass.cpp

void Myclass::doSomething()
{

}

此外,请阅读Namespaces,将自定义类放在命名空间中以避免符号名称冲突是一个好习惯。

于 2012-08-29T04:54:49.507 回答
0

您已经为您的类声明并定义了所有函数。另一方面,您只声明了构造函数,但没有定义构造函数。这就是链接器错误告诉您的内容。

由于您已询问将您的代码分成 .h 和 .cpp 文件,因此我不会详细介绍链接器错误。相反,我将向您展示如何开始分离您的代码。

首先,我建议您只使用声明创建 .h。您还可以包含模板和内联函数。但是,在您了解这些工作原理之前,让我们坚持基础知识。我将用你LibItem类的前几个函数来说明:

class LibItem
{
    public:
        LibItem();
        ~LibItem(); //DO ******************
        virtual void PrintDetails() = 0;
        void setDetails(string setItemTitle, string setItemAuthor, string setItemReleaseDate, string setItemCopyright, string setItemGenre, string setItemStatus);
        // The rest of your function declarations here.

    private:  
        string Title;  
        string ReleaseDate;  
        string Author;  
        string Copyright;  
        string Genre;  
        string Status;  
};

请注意,类声明中每个成员函数只包含一行。这只是告诉编译器函数的名称、返回类型和参数类型。它没有给出函数的实际作用。在 .cpp 文件中作为函数定义出现,如下所示:

void LibItem::setDetails(string setItemTitle, string setItemAuthor, string setItemReleaseDate, string setItemCopyright, string setItemGenre, string setItemStatus)
{
    Title = setItemTitle;
    Author = setItemAuthor;
    ReleaseDate = setItemReleaseDate;
    Copyright = setItemCopyright;
    Genre = setItemGenre;
    Status = setItemStatus;
}

请注意类名和“::”运算符如何处理成员函数名。这告诉编译器该setDetails()函数是LibItem该类的成员。

最后,您需要能够编译和链接所有代码。具体细节取决于您的环境。如果您g++在命令行上使用,则可以使用以下命令编译代码:

g++ main.cpp library.cpp

假设您有一个名为 的文件main.cppmain()并且您在 OP 中发布的代码位于名为 library.cpp 的文件中。

当您开始创建更复杂的程序时,您将需要使用可帮助您管理源文件的工具。make是一个非常强大的工具来做到这一点。许多 C++ IDE 在后台使用它。谈论 IDE:这些允许您创建“项目”,帮助您管理多个源文件并将它们编译并链接到单个可执行文件中。

ps作为旁注,您应该使用空格而不是制表符来格式化您的代码。后者不可移植,尤其是对于像这样的问答网站;他们经常创建与您在编辑器中看到的不同的格式。

于 2012-08-29T05:10:20.913 回答
0

您最近的错误是因为您的构造函数DVD需要 6string秒,1 秒,int然后是 3string秒。

顺便

test = new DVD("TestDVD","Test Author","01-01-2012",
  "TestCopyright","TestGenre","TestStatus","120","TestDirector",
  "TestStudio","TestProducer");

你给了 10string秒。"120"并且120是非常不同的东西——第一个是 astring表示 120,第二个是一个int值 120。C++ 不会在它们之间自动转换。

试试这个:

test = new DVD("TestDVD","Test Author","01-01-2012",
  "TestCopyright","TestGenre","TestStatus",120,"TestDirector",
  "TestStudio","TestProducer");
于 2012-08-29T09:22:14.763 回答