C ++ const char *

时间:2012-08-29 04:53:05

标签: c++ class abstract-class linker-errors

修改

这是我的新代码:

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 *)'

我能否提供一些有关此错误发生原因以及解决方法的信息?

3 个答案:

答案 0 :(得分:0)

  

为什么会这样?

您刚刚为您的类声明了构造函数LibItem(),但没有定义它。当然,链接器无法找到它并抱怨相同的内容 你也需要定义它。

LibItem()::LibItem()
{
}

析构函数的情况也是如此 请注意,如果您没有明确地为您的类声明构造函数或析构函数,那么编译器会隐式生成这些函数的定义,但如果您明确声明这些,那么为它们提供定义的责任就在于您。

  

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

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

一个例子:

<强> // Myclass.h

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

<强> // Myclass.cpp

void Myclass::doSomething()
{

}

另外,请阅读 Namespaces ,最好将自定义类放在命名空间中,以避免符号名称冲突。

答案 1 :(得分: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.cpp的文件,其中包含main(),并且您在OP中发布的代码位于名为library.cpp的文件中。

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

p.s。作为旁注,您应该使用空格来格式化代码而不是标签。后者不便携,特别是对于像这样的Q&amp; A网站;它们通常会创建与您在编辑器中看到的格式不同的格式。

答案 2 :(得分:0)

您的最新错误是因为DVD的构造函数需要6 string s,1 int然后再增加3 string

传递

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

你给了10 string个。 "120"120是完全不同的东西 - 第一个是string,表示120,第二个是int,值为120. C ++不会自动转换它们。

请改为尝试:

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