pointer do obiektu na stacku

0

mam problem... mając na stacku pointer do obiektu klasy Node, zrzucając go ze stacka chce go pszypisać do nowego obiektu tej samej klasy... jak to zrobic ??
oto kawałek kodu:

class Node{
private:
	char val;
	Node  *left_child;
	Node  *right_child;
public:
	Node(){val=NULL;left_child=NULL;right_child=NULL;};
	Node(char value){val=value; left_child=NULL; right_child=NULL;};
	Node(char value, Node* l_child, Node* r_child){
		val=value; left_child=l_child; right_child=r_child;};



};
Node  *NewNode, *NewLeft, *NewRight;

stack <Node> node_stack;

//..............................Parsing

for(j=0;j<(int)output.size(); j++){
	
		if (is_operand(output.at(j))){
			NewNode =new Node(output.at(j),NULL,NULL);
			node_stack.push(*NewNode);
			cout<<"Stack size after operand: "<<node_stack.size()<<endl;
		}
		if (is_operator(output.at(j))){
			
			*NewLeft=node_stack.top();          // HERE debuger signals errrror
			node_stack.pop();
			*NewRight=node_stack.top();
			node_stack.pop();
			NewNode=new Node(output.at(j),NewLeft,NewRight);
			node_stack.push(*NewNode);
		}
		//cout<<NewNode->val;

	}
0
*NewLeft=node_stack.top();          // HERE debuger signals errrror

A na co wskazuje NewLeft (i przy okazji NewRight)? :>

NewNode =new Node(output.at(j),NULL,NULL);
node_stack.push(*NewNode);

Zdecyduj się, albo node_stack przechowuje wskaźniki, albo obiekty Node. Teraz masz wyciek.

0

czyli :

NewRight=&(node_stack.top());
0

Nie, bo pobierasz wskaźnik na obiekt, który po wywołaniu pop przestanie istnieć.

0

no więc jak to rozwiązać ??

mam wrzucać na stack, obiekty a nie pointery do nich ??

0

Obiekty to teraz wrzucasz. Niech stos przechowuje wskaźniki.

0
0x666 napisał(a)

Nie, bo pobierasz wskaźnik na obiekt, który po wywołaniu pop przestanie istnieć.

hmmm chyba jednak potrzebuje wrzucac wskazniki do obiektow na stack i potem je pobierac... bo obiekty istnieja w innym miejscu niz stack, a ja wykonujac funkcje pop() na stacku, mam juz przepisane adresy do tych obiektow

czy dobrze rozumie ??

0

zrobuiłem cos takiego:

for(j=0;j<(int)output.size(); j++){
		cout<<j<<" loop:"<<endl;
		if (is_operand(output.at(j))){
			NewNode =new Node(output.at(j),NULL,NULL);
			node_stack.push(*NewNode);
			cout<<"Stack size after operand: "<<node_stack.size()<<endl;
		}
		if (is_operator(output.at(j))){
			
			NewRight=&(node_stack.top());
			node_stack.pop();
			cout<<"Stack size after 1 pop: "<<node_stack.size()<<endl;
			cout<<"R: "<<NewRight->val<<endl;
			
			NewLeft=&(node_stack.top());
			node_stack.pop();
			cout<<"Stack size after 2 pop: "<<node_stack.size()<<endl;
			cout<<"L: "<<NewLeft->val<<endl;

			NewNode=new Node(output.at(j),NewLeft,NewRight);
			cout<<"Node root: "<<NewNode->val<<endl;
			cout<<"L: "<<NewNode->left_child->val<<endl;
			cout<<"R: "<<NewNode->right_child->val<<endl;
			
			node_stack.push(*NewNode);
			Tempp=&(node_stack.top());
			cout<<"Node root after push on stack: "<<Tempp->val<<endl;
			cout<<"L: "<<Tempp->left_child->val<<endl;
			cout<<"R: "<<Tempp->right_child->val<<endl;
			
			cout<<endl;
	
	
		}
		
			
	}
	cout<<endl;
	cout<<"Stack size: "<<node_stack.size()<<endl;
	
	
	////	
	return 0;

}

no i mam wynik taki:

Node root: -
L: a
R: b
Node root after push on stack: -
L: -
R: b

czyli przed wrzuceniem na stack node wyglada ok, a po wrzuceniu juz nie ... o co chodzi ??

0
NewRight=&(node_stack.top());

Heh, przecież pisałem, że to jest źle. Jak chcesz trzymać wskaźniki na stosie, to przydałoby się najpierw od niego zacząć, czyli zadeklarować go tak, żeby te wskaźniki przechowywał:

stack <Node*> node_stack;

wtedy to:

NewLeft = node_stack.top();
node_stack.pop();
NewRight = node_stack.top();
node_stack.pop();
node_stack.push(new Node(output.at(j),NewLeft,NewRight));

będzie poprawne.

0

heh, dzieki stokrotne :) zapomniałem o tym ze skoro stack ma przechowywac pointery to trzeba mu w deklaracji o tym powiedziec :)

pozdrawiam. problem rozwiazany... brakowalo jednej *:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1