dziedziczenie i rzutowanie wskaznika problem

0

mam w programie takie klasy:

// ObjectType i RequestType to typy enum, nie maja tu wiekszego znaczenia wiec nie przedstawiam naglowkow
class Header
{
protected:
	ObjectType id;  // typ obiektu ktory potem bede odbieral za pomoca wskaznika typu Header ( jest po to by go rozpoznac )
public:
	ObjectType GetId ( );
	virtual std::string Serialize () const = 0; 
};

//           i


class Request:public Header
{
	RequestType m_type; 
	std::string m_args;
public:
	Request ( );
	Request ( std::string buffer );
	std::string Serialize ( ) const;
// i dalsze metody get i set

};

i jeszcze fragment kodu gdzie ich urzywam:

                Header * object;         // tworze wskaznik klasy Header (chce nim odebrac obiekt jakies klasy dziedziczacej po Header, jeszcze nie wiem ktorej)
		object = m_mediator->Recieve ( );  // odbieram ten obiekt, tutaj wszystko jest ok (sprawdzalem debuggerem VS 8/10/12
		while ( object != false )  // obiekt jest w porzadku, jego Header::id jest rowne request (enum)
		{
			if ( object->GetId() == message ) // i tu wlasnie nagle id sie zmienia na jakas duza ujemna wartosc, jak tylko //wejdziemy do funkcji GetId, co ciekawe jak zrobimy id publiczne i odniesiemy sie bezposrednio do niego (bez funkcji) to zwroci //wartosc normalnie, bez bledow, nie zmieniona
			{
				Message * msg = (Message*)object;
				ClientsMsg ( msg );
			}else if ( object->GetId() == request )
			{
				Request * rqst = (Request*)object;
				switch ( rqst->GetType ( ) )
				{
				case nickToConfirm:
					ConfirmNick ( rqst );
					break;
//         dalsza czesc kodu
 

Dodam jeszcze, ze kazda inna funkcja wywolana na tym obiekcie powoduje taki sam reset wartosci, nie tylko Header::id
Ktos ma jakis pomysl czemu tak sie dzieje? Zle rzutowanie? Zle zaimplementowane naglowki? Czekam na odpowiedzi..

0
  1. Czemu Request jest szczególnym przypadkiem Headera? o_O
  2. Co zwraca receive()? Wskaźnik czy może obiekt?
0
Header * Mediator::Recieve ( )
{
	// fragment kodu, szukanie pakietu i sprawdzanie poprawosci, takie tam
			{
				switch ( m_recvBuffer [ startPos + 1 ] )
				{
				case message:
					{
						Message msg = Message ( m_recvBuffer.substr ( startPos - 1, endPos + 1 ) ); // tutaj wyciagamy z bufora potrzebne informacje, czyli przesylamy string
						m_recvBuffer.erase ( 0, endPos + 1 );
						if ( msg.id != invalidType )
						{
							return &msg;
						}else return false;
					}
				case request:
					{
						Request rqst = Request ( m_recvBuffer.substr ( startPos, endPos ) ); // tu to samo co przy msg
						m_recvBuffer.erase ( 0, endPos + 1 );
						if ( rqst.id != invalidType )
						{
							return &rqst;
						}else return false;
					}
// itd itd
 

Dodam jeszcze konstruktor request, bo pewnie o to poprosisz :)

Request::Request ( string buffer ) //deserializator
{
	int typePos = 2;
	int argsBeginPos = 3;
	if ( buffer[typePos] >= nickToConfirm && buffer[typePos] <= disconnectServ )
	{
		if ( buffer[ argsBeginPos ] == ARGS_BEGIN )
		{
			int argsEndPos = buffer.find ( ARGS_END, argsBeginPos + 1 );
			if ( argsEndPos == string::npos )
			{
				id = invalidType;
			}else
			{
				if ( buffer [ typePos ] == nickToConfirm )
				{
					id = request;
					m_type = nickToConfirm;
					m_args = buffer.substr ( argsBeginPos + 1, argsEndPos - argsBeginPos - 1 );
				}else id = invalidType;
			}
		}else
		{
			switch ( buffer [ typePos ] )
			{
			case sendAllNicks:
				id = request;
				m_type = sendAllNicks;
				break;
			case disconnectServ:
				id = request;
				m_type = sendAllNicks;
				break;
			default:
				id = invalidType;
			}
		}
	}else id = invalidType;
}

Pewnie powiesz, ze jest to kiepsko napisane :) szczerze mowiac nie mialem lepszego pomyslu jeszcze na to, w kazdym razie tutaj wszystko idzie pieknie zgodnie z planem, dopiero potem nagle sie psuje..

0

A no wszystko jasne. Tworzysz obiekt LOKALNY na stosie a potem zwracasz jego adres, czego robić nie wolno. Takie obiekty znikają po wyjściu z funkcji. Musisz to alokować dynamicznie jeśli chcesz tak robić.
Poza tym zwracanie "false" z funkcji która zwraca wskaźnik to jest horror. Daj tam chociaż nulla z łaski swojej.

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