C++ 在堆栈中分割字符串

C++ 在堆栈中分割字符串,c++,string,class,templates,C++,String,Class,Templates,我仍然停留在一个问题上,这个问题一直伴随着一个类赋值,这个类赋值与模板和基于链表的堆栈一起工作。我不断地犯分割错误,我一辈子都不明白为什么 main要求提供一个值来确定要玩游戏的磁盘数量,该值调用set_Discs,将xs附加到字符串对象tmp_str以表示游戏的磁盘。然后,该字符串对象被推到堆栈杆[0]上,即第一个杆,然后它会循环返回。我每次通过循环调用cout打印top-stack对象作为一个测试,它工作正常,因此我可以成功地存储string对象。然而,在调用下一个函数print_Game时

我仍然停留在一个问题上,这个问题一直伴随着一个类赋值,这个类赋值与模板和基于链表的堆栈一起工作。我不断地犯分割错误,我一辈子都不明白为什么

main要求提供一个值来确定要玩游戏的磁盘数量,该值调用set_Discs,将xs附加到字符串对象tmp_str以表示游戏的磁盘。然后,该字符串对象被推到堆栈杆[0]上,即第一个杆,然后它会循环返回。我每次通过循环调用cout打印top-stack对象作为一个测试,它工作正常,因此我可以成功地存储string对象。然而,在调用下一个函数print_Game时,它会执行for循环的第一次迭代,打印第一行,然后再次执行

int main() {
TowerHanoi game;
size_t disc_in;

    //How many discs to be used
cout << "Welcome to Towers of Hanoi!"<< "Please enter how many discs you want to play with: " << endl;
cin >> disc_in;

game.set_Discs(disc_in);
game.print_Game();
//Ask for source and target rod

return EXIT_SUCCESS;
}
功能print_游戏是一个最近的逻辑尝试,所以请原谅我,如果它不好,工作不足。循环添加间距,然后打印顶部字符串对象,然后调用pop,pop在LinkedList.template中调用removeFromHead,使下一个字符串对象下次通过循环成为顶部对象,依此类推。请参阅addToHead

LStack.template中的一些相关代码这是堆栈:

    //push
template <typename Obj>
void LStack<Obj>::push(Obj& head_in) {

    list->addToHead(head_in);
    used++;
}

//pop
template <typename Obj>
Obj LStack<Obj>::pop() {
    used--;
    return list->removeFromHead();

}
//top
template <typename Obj>
const Obj& LStack<Obj>::top() {
    return list->list_getHead();
}
LinkedList.template中的相关代码:

template <typename Item>
void LinkedList<Item>::addToHead(Item& entry) {
    node<Item>* temp = head;
    head = new node<Item>();
    head->set_data(entry);
    head->set_link(temp);

}

    template <typename Item>
const Item& LinkedList<Item>::removeFromHead() {
    node<Item>* head_copy = head; //create a copy of head
    head->set_data(head_copy->link()); //set head's data to the previous object
    return head_copy->data(); //return head's original data
}
    template <typename Object>
void node<Object>::set_data(const Object& new_data){
        word = new_data;
}


template <typename Object>
void node<Object>::set_link(node<Object>* new_link){
        next= new_link; 

}


template <typename Object>
void node<Object>::set_previous(node<Object>* new_prev) {
        previous = new_prev; 
}


template <typename Object>
const Object& node<Object>::data() const{  //return the word
        return word;
}


template <typename Object>
const Object& node<Object>::link() const { //return next node (const function)
        return next->data();
}


template <typename Object>
const Object& node<Object>::back() const { //return previous node (const)
        return previous->data();
}
Node.template:

template <typename Item>
void LinkedList<Item>::addToHead(Item& entry) {
    node<Item>* temp = head;
    head = new node<Item>();
    head->set_data(entry);
    head->set_link(temp);

}

    template <typename Item>
const Item& LinkedList<Item>::removeFromHead() {
    node<Item>* head_copy = head; //create a copy of head
    head->set_data(head_copy->link()); //set head's data to the previous object
    return head_copy->data(); //return head's original data
}
    template <typename Object>
void node<Object>::set_data(const Object& new_data){
        word = new_data;
}


template <typename Object>
void node<Object>::set_link(node<Object>* new_link){
        next= new_link; 

}


template <typename Object>
void node<Object>::set_previous(node<Object>* new_prev) {
        previous = new_prev; 
}


template <typename Object>
const Object& node<Object>::data() const{  //return the word
        return word;
}


template <typename Object>
const Object& node<Object>::link() const { //return next node (const function)
        return next->data();
}


template <typename Object>
const Object& node<Object>::back() const { //return previous node (const)
        return previous->data();
}

标识正在堆栈上推送的数据:

void TowerHanoi::set_Discs(size_t disc) 
{
    while (disc > 0) 
    {
        string tmp_str;               <-- note here, tmp_str is stack variable
        rod[0].push(tmp_str);
    }
}
现在,让我们看看LStack::push函数:

//push
template <typename Obj>
void LStack<Obj>::push(Obj& head_in)   <-- note here, input to push() is pass by reference
{
    list->addToHead(head_in);
    used++;
}
一旦set_Discs函数调用完成,此函数中使用的堆栈变量的引用无效


这可能与在使用LStack存储数据时调用print_Game函数时程序突然崩溃/终止有关。

rod的声明是什么样子的?这些方法都是静态的吗?没有新的操作员?LStack rod[2];网络。复制head后,addToHead中有一个,声明head=new节点;这是根据另一个人的建议,保罗。@CameronO'Reilly head->set\u datahead\u copy->link;应产生编译错误。如果您试图通过head->set\u linkhead\u copy->link来修复它;或head->set\u datahead\u copy->data;,您有一个函数,它不执行任何操作,然后返回最上面的项。在该函数中可能会看到head的修改和delete。另一个潜在问题是复制整个列表,如LStack rodCopy=rod[0];。当涉及到指针时,必须非常小心地对原始堆栈进行深度复制。否则,在销毁列表时会出现问题,例如一个节点似乎是两个列表的成员。您尚未显示复制或销毁堆栈的代码。谢谢您的建议。那么这是否意味着在node::set_data中,我应该声明一个新的string对象,然后说word=new_string;?因此,创建tmp_str的副本,然后存储该副本而不是引用?@CameronO'Reilly,是的,你是对的。此外,您还必须在pop中释放分配的内存。否则,我认为将LStack::push函数的原型更改为void LStack::pushObj head_将很好。在这种情况下,其他代码保持不变。[按值传递/复制而不是按引用传递]。我已将其更正为不存在segfault,但在打印时,它会打印前两个对象x和xxx,然后打印第二个对象的副本。像这样,这可能是addToHead中的错误吗?