使用c ++中的类模板接口继承,抛出未解析的外部符号

时间:2013-06-02 01:24:51

标签: c++ class templates inheritance interface

在开始之前,我只想说我已经完全阅读了C++ FAQ关于模板的链接器问题。我已经尝试了他们的所有建议,包括

  1. 将模板函数的定义物理移动到.h文件
  2. 添加行

    模板类ArrayBag;

  3. 到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
    

0 个答案:

没有答案