修改
这是我的新代码:
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 *)'
我能否提供一些有关此错误发生原因以及解决方法的信息?
答案 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");