在开始之前,我只想说我已经完全阅读了C++ FAQ关于模板的链接器问题。我已经尝试了他们的所有建议,包括
添加行
模板类ArrayBag;
到cpp文件的末尾
我试过阅读类似的问题。有些人suggested使派生类文件(在本例中为ArrayBag.cpp和ArrayBag.h)成为一个文件。另一个suggested没有在单独的文件中定义接口和派生类,就像我在BagInterface和ArrayBag中所做的那样。这些似乎没有解决我的问题与来自行
的未解决的外部符号ArrayBag<string> b;
在main.cpp文件中。如果我对此进行评论,其他所有内容似乎都会正确构建。
我彻底阅读了这个
另一篇文章建议将所有接口函数设置为纯虚拟(我现在注释掉的“const = 0”)然后我遇到一个新错误,说明ArrayBag是一个抽象数据类型,无法实例化我我不知道如何解释,因为我有一个ArrayBag的实现。无论如何,一些建议将不胜感激。
这就是我所拥有的:所以我正在尝试为基于数组的列表工作创建此类模板。名为BagInterface的列表有一个接口,因为最终我将实现一个Linked List版本。在我的主要内容中,我只是尝试声明ArrayBag的一个实例,但它一直在抛出这个未经破坏的外部符号错误。最终我希望能够声明一个BagInterface,然后让用户决定使用ArrayBag还是LinkedListBag。
/** @file BagInterface.h */
# ifndef BAGINTERFACE_H
# define BAGINTERFACE_H
# include <vector>
#include <string>
template < class ItemType >
class BagInterface
{
public:
BagInterface();
virtual int getCurrentSize () /*const = 0*/;
virtual bool isEmpty () /*const = 0*/;
virtual bool add (const ItemType & newEntry) /*= 0*/;
}
; // end BagInterface
#endif /* BAGINTERFACE_H_ */
ArrayBag.h
/** @file BagInterface.h */
# ifndef ARRAYBAG_H
# define ARRAYBAG_H
#include <vector>
#include <string>
#include "BagInterface.h"
template < class ItemType >
class ArrayBag : public BagInterface < ItemType >
{
private:
ItemType theBag [100];
int count;
public:
ArrayBag();
int getCurrentSize () /*const = 0*/;
bool isEmpty () /*const = 0*/;
bool add (const ItemType & newEntry) /*= 0*/;
}; // end
#endif /* BAGINTERFACE_H_ */
ArrayBag.cpp
# include "ArrayBag.h" // For ADT bag
template < class ItemType > // it is template for class name
ArrayBag<ItemType>::ArrayBag() // defualt constructor
{
count = 0; // initial value is zero for count
}
template < class ItemType >
int ArrayBag<ItemType>::getCurrentSize()
{
return count;
} // end getcurrentSize
template < class ItemType >
bool ArrayBag<ItemType>::isEmpty(){
return count==0;
} // end isempty
// flag variable is true after it will check if count value is greater or equal that 100. If count is greater than 100
// return value is flase. If return count value is less than 100, it will implement thabag array is count = new Entry parameter
// after count will be increasing/
template < class ItemType >
bool ArrayBag<ItemType>::add (const ItemType & newEntry){
bool flag = true;
if(count>=100)
{
return false;
} //end if
else
{
theBag[count]=newEntry;
count++; // it is incrementation
}
return flag;
} // end add
的main.cpp
#include "ArrayBag.h"
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main ()
{
/*Attempt 1
BagInterface < string > *bagPtr = nullptr;
bagPtr = new ArrayBag < string > ();
bagPtr.add("hello");
cout << add.getCurrentSize()<<endl;
delete bagPtr;
bagPtr = nullptr*/
//Attempt 2
ArrayBag<string> b;
//b.add("hello");
//cout << b.getCurrentSize()<<endl;
system("PAUSE");
return 0;
} // end main