webForumDet fria alternativet

Callback funktion

3 svar · 274 visningar · startad av Viktor

ViktorMedlem sedan aug. 20021 752 inlägg
#1

Hej

Jag har en klass som ser ut såhär,

class CApp
{
private:
	Event event;
	vwf::CVGPtr<vwf::CButton> m_Button;
	vwf::CVGPtr<vwf::CAction<CApp> > m_Action;
public:
	void Start();
	void Action(Event event, vwf::CVGPtr<vwf::CScreenObject> scrObj);
};

void CApp::Start()
{
	m_Button=CButton::create("Button");
	try
	{
		event.what=terminal::ENTER;

		m_Action=CAction<CApp>::create(this,&CApp::Action,event);
		m_Button->AddAction(dynamic_ptr_cast<CActionBase>(m_Action));

		m_Frame->AddScreenObject(dynamic_ptr_cast<CScreenObject>(m_Button));
		m_Frame->Show();

	}
	catch(out_of_range& oor)
	{
		cout << "Error: " << oor.what() << endl;
	}
}

void CApp::Action(Event event, CVGPtr<CScreenObject> scrObj)
{
	m_Button->SetText("Test");
	m_Button->RemoveAction(dynamic_ptr_cast<CActionBase>(m_Action));
}

Vid koden "m_Frame->Show()" så visas fönstret och programmet stannar där tills jag avslutar det. När jag trycker på Enter i programmet (när fönstret är uppe) så ska funktionen "Action" anroppas och det fungerar, jag kan ändra texten på knappen, MEN när jag debuggar programmet så ser "m_Action" ut såhär,

{ptr = 0x805d250, count = 0x805d288}

det ser helt ok ut, den pekar ut sitt objekt och en räknare. Det ger samma resultat oavsätt om man är innan eller efter "m_Frame->Show" anroppet.
Men när jag kollar på "m_Action" i Action funktionen när jag har tryckt på enter så ser den ut såhär,

{ptr = 0x0, count = 0x0}

Pekar inte på något! Ska det inte vara samma variabel/instans som i "Start" funktionen? "m_Button" har samma värde på alla ställen.

Det finns mycket mer kod, men jag hoppas och tror att felet ligger i den kod som jag har postat, säg till om ni vill se mer :)

/Viktor

Sang-draxMedlem sedan juli 2002581 inlägg
#2

Felet kanske ligger i vwf::CVGPtr.

Utan att veta någonting om denna klass eller något annat i övrigt gissar jag på att vwf::CVGPtr är en 'smart pekare' dvs den tar automatiskt bort det den pekar på när det inte längre används.

ViktorMedlem sedan aug. 20021 752 inlägg
#3

Japp, det är en smart pekare (för smart? ;))
Men den kan ju inte vara borttagen eftersom den finns kvar senare i programmet, i Start funktionen :l

/Viktor

Sang-draxMedlem sedan juli 2002581 inlägg
#4

Lägg till lite breakpoints eller debug-utskrifter i CVGPtr::~CVGPtr()

För att man ska kunna gissa felet behövs betydligt mer information, men jag tror att felet ligger i hur du hanterar den smarta pekaren tillsammans med övriga funktioner.

130 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)