C++ C++;将一个类实例强制转换为另一个实例会引发:没有合适的定义从类到类2的转换

C++ C++;将一个类实例强制转换为另一个实例会引发:没有合适的定义从类到类2的转换,c++,C++,这是我的密码: using namespace std; class HuffmanTree { public: int frequency; HuffmanTree(){} HuffmanTree(int freq) { frequency = freq; } int compareTo(HuffmanTree tree) { return frequency - tree.frequency;

这是我的密码:

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);
    }
}

我知道这与类型转换有关,我对动态、静态和其他两种类型做过研究,我似乎不知道它要求什么。任何帮助都将不胜感激。如果您发现了任何其他问题,请告诉我。

向下广播是非法的。
HuffmanTree
既不是
HuffmanNode
,也不是
HuffmanLeaf
,相反

你想做的事没有意义。为什么要将
HuffmanTree
转换为
HuffmanNode
HuffmanLeaf


无论哪种方式,要将其编译到中(但是,同样没有意义),您必须为
huffmanode
HuffmanLeaf
声明转换构造函数,或者添加
操作符huffmanode()
操作符HuffmanLeaf()
to
HuffmanTree

您没有正确调用基本构造函数。阅读关于构造函数初始化列表的内容。你似乎也在试图转换具体的对象,而不是指针。@Joe什么?当然可以。清楚问题的措辞有助于沟通,这一点很重要。您得到的是编译器错误,这与抛出非常不同(通常指运行时异常),谢谢评论,我不太喜欢C++,这是我在StAcExcel上的第一篇文章。我真的很感激任何反馈。当然,只要是建设性的;)向上投射是非法的??我想你的意思是把
HuffmanTree
向下投射到
HuffmanNode
HuffmanLeaf
都是非法的。@DavidRodríguez dribeas向下投射,是的,我就是这么说的…:派斯,这就是我想我读到的。。。我不知道我为什么写这篇评论;)有些情况下,HuffmanNode或HuffmanLeaf会被传递到HuffmanTree类型的PriorityQueue,这就是为什么我试图将节点或叶转换为树。我现在最大的问题实际上是为HuffmanNode和HuffmanLeaf创建转换构造函数。我查阅了关于转换构造函数的不同文章,但不完全确定如何为这些类创建转换构造函数。
HuffmanNode node = (HuffmanNode)tree;
HuffmanLeaf leaf = (HuffmanLeaf)tree;