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