c++ - How to instantiate Map within a class? -
i'm making encoding class. failing build. i'm instantiating map within function , getting error message "delete called on 'map::comparator' abstract has non-virtual destructor". ideas how build?
here's header file;
#ifndef _encoding_ #define _encoding_ #include "bstream.h" #include "vector.h" #include "map.h" #include "huffmantypes.h" #include "pqueue.h" class encoding { public: encoding(); ~encoding(); void compress(ibstream& infile, obstream& outfile); void decompress(ibstream& infile, obstream& outfile); //map<ext_char, std::string> *referencetable; std::string compresskey; private: string filename; map<ext_char, int> getfrequency(ibstream& infile); void createhuffman(); //map<ext_char, int> *frequencytable; huffmanpqueue huffqueue; //void buildtree(); //void createreferencetable(); //node getnode(node root); //void tracepaths(node root, string path, int weight); }; #endif
here's cpp file:
/** * file: encoding.cpp * ------------------ * place encoding class implementation here. */ #include "encoding.h" #include "string.h" #include "map.h" #include "strlib.h" #include "huffmantypes.h" #include "pqueue.h" using namespace std; encoding::encoding() { } encoding::~encoding() { } void encoding::compress(ibstream& infile, obstream& outfile) { map<ext_char, int> frequencytable; frequencytable = getfrequency(infile); compresskey = ""; foreach(ext_char key in frequencytable) { int freq = frequencytable.get(key); node* newnode = new node; newnode->character = key; newnode->weight = freq; newnode->zero = null; newnode->one = null; huffqueue.enqueue(newnode); string keystring = integertostring(key); string valstring = integertostring(freq); compresskey = compresskey + "key = " + keystring + " " + "freq = " + valstring + " "; } //buildtree(); //createreferencetable(); } void encoding::decompress(ibstream& infile, obstream& outfile) { } map<ext_char, int> encoding::getfrequency(ibstream& infile) { map<ext_char, int> frequencytable; int ch; while((ch = infile.get()) != eof){ if(frequencytable.containskey(ch)){ int count; count = frequencytable.get(ch); frequencytable[ch] = ++count; } else { frequencytable.put(ch, 1); } } frequencytable.put(pseudo_eof, 1); return frequencytable; }
the compiler telling you, abstract class map::comparator needs virtual destructor. if delete object through pointer base class, invoke undefined behavior, if base class contains no virtual destructor.
btw: omit empty constructor , destructor class. nervous if read class declaration, seeing destructor, no copy constructor , no assignment operator.
Comments
Post a Comment