-1

これが私のコードです:

using namespace std;

class HuffmanTree
{
public: 
    int frequency;

    HuffmanTree(){}
    HuffmanTree(int freq)
    {
        frequency = freq;
    }

    int compareTo(HuffmanTree tree)
    {
        return frequency - tree.frequency;
    }
}

class HuffmanLeaf : public HuffmanTree
{
public:
    char value;

    HuffmanLeaf(int freq, char val)
    {
        HuffmanTree(freq);
        value = val;
    }
}

class HuffmanNode : public HuffmanTree
{
public:
    HuffmanTree left, right;

    HuffmanNode(HuffmanTree l, HuffmanTree r)
    {
        HuffmanTree(l.frequency + r.frequency);
        left = l;
        right = r;
    }
}

class HuffmanCode
{
    static HuffmanTree buildTree(int charFreqs[])
    {
        priority_queue<HuffmanTree> pq;

        for(int i = 0; i < sizeof(charFreqs)/sizeof(char); i++)
        {
            if(charFreqs[i] > 0)
                pq.push(HuffmanLeaf(charFreqs[i], (char)i));
        }
        while (pq.size() > 1)
        {
            // two trees with least frequency
            HuffmanTree a = pq.top();
            pq.pop();
            HuffmanTree b = pq.top();
            pq.pop();

            // put into new node and re-insert into queue
            pq.push(HuffmanNode(a, b));
        }
        HuffmanTree c = pq.top();
        pq.pop();
        return c;
    }
}

static void printCodes(HuffmanTree tree, string prefix) {
    //assert tree != null;
    HuffmanTree* baseClass;
    HuffmanLeaf* leafClass;
    HuffmanNode* nodeClass;
    if (typeid(*baseClass) == typeid(HuffmanLeaf)) 
    {
        HuffmanLeaf leaf = (HuffmanLeaf)tree;

        // print out character, frequency, and code for this leaf (which is just the prefix)
        cout<<leaf.value<<"\t"<<leaf.frequency<<"\t"<<prefix;
    }
    else if (typeid(*baseClass) == typeid(HuffmanNode)) 
    {
        HuffmanNode node = (HuffmanNode)tree;

        // traverse left
        prefix.append("0");
        printCodes(node.left, prefix);
        prefix.erase(prefix.length()-1);

        // traverse right
        prefix.append("1");
        printCodes(node.right, prefix);
        prefix.erase(prefix.length()-1);
    }
}

行が失敗する問題を修正する方法がわかりません

HuffmanNode node = (HuffmanNode)tree;
HuffmanLeaf leaf = (HuffmanLeaf)tree;

私はそれが型変換に関係していることを知っています.dynamic_cast、static_cast、および他の2つについて調査しましたが、それが何を求めているのか理解できないようです. どんな助けでも大歓迎です。また、他に問題が見つかった場合は、お知らせください。

4

1 に答える 1

3

ダウンキャストは違法です。AHuffmanTreeHuffmanNode、でも、でもありませんHuffmanLeafが、その逆です。

あなたがやろうとしていることは本当に意味がありません。なぜあなたはをまたはに変換するHuffmanTreeHuffmanNodeですHuffmanLeafか?

いずれにせよ、これをコンパイルするには(ただし、これも意味がありません)、HuffmanNodeまたはの変換コンストラクターを宣言するか、およびをHuffmanLeaf追加する必要があります。operator HuffmanNode()operator HuffmanLeaf()HuffmanTree

于 2012-04-16T19:55:33.340 に答える