1

私はエンコーディングクラスを作っています。現在、ビルドに失敗しています。関数内からマップをインスタンス化していますが、「抽象的ですが非仮想デストラクタを持つ 'Map::Comparator' で削除が呼び出されました」というエラー メッセージが表示されます。これを構築する方法はありますか?

これがヘッダー ファイルです。

#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

cpp ファイルは次のとおりです。

/**
 * File: encoding.cpp
 * ------------------
 * Place your 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;
}
4

1 に答える 1

1

コンパイラは、抽象クラス Map::Comparator には仮想デストラクタが必要であることを伝えています。基本クラスへのポインタを介してオブジェクトを削除すると、その基本クラスに仮想デストラクタが含まれていない場合、未定義の動作が呼び出されます。

ところで:あなたのクラスの空のコンストラクタとデストラクタは省略します。あなたのクラス宣言を読んで、デストラクタを見て、コピー コンストラクターも代入演算子もないとしたら、私は神経質になります。

于 2013-05-19T11:36:39.773 に答える