我想创建一个树,其中每个节点代表一个字符串,叶节点表示由字符创建的字符串,该字符串通向此叶节点。我的方法(也许类名有点误导,这只是一个快速原型,Foo是基类,Bar是节点,BarBar是叶节点):
class Foo{
public:
virtual void print() = 0;
};
class BarBar : public Foo {
public:
BarBar(int mData) : data(mData){};
int data;
void print(){
cout << data << endl;
}
};
class Bar : public Foo {
public:
map<char,Foo*> ptr;
void insert(char c, Foo* f){
ptr.insert(pair<char,Foo*>(c,f));
}
void procStr(char* str, int dat){
if(str[0] != '\0'){
Bar b;
insert(str[0],b); //error "Invalid arguments 'Candidates are:void insert(char, Foo *)'"
str++;
b.procStr(str,dat);
} else {
BarBar bar(dat);
insert('^',bar); //error "Invalid arguments 'Candidates are:void insert(char, Foo *)'"
}
}
void print(){
for (auto& kv : ptr){
cout << kv.first << endl;
kv.second->print();
}
}
}
int main(){
Bar root;
root.procStr("Hello",42);
root.print();
return 0;
}
我的预期输出是:
H
e
l
l
o
但我得到了:
H
Ä
并且程序崩溃了。
程序崩溃:
Foo& res = kv.second;
res.print(); //<<-- Program crashes
答案 0 :(得分:0)
BarBar bar(dat);
insert('^',bar); //error "Invalid arguments 'Candidates are:void insert(char, Foo *)'"
你的函数需要一个Foo *,但你传递的是一个实例(当时仍然是一个本地实例,所以即使你通过了&amp; bar,它在你使用它时也会无效。)
地图确实不是这个问题的正确结构,查找订单统计树,它们提供排序而不进行排序,这就是你在此之后所做的。也就是说,OS树可以存储&#39;&#39; h&#39;就像&#39; h&#39;,&#39; o&#39;。