Jump to content

  • Log In with Google      Sign In   
  • Create Account


C++ Interitance and functions within functions


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
3 replies to this topic

#1 Marsupial Rodentia   Members   -  Reputation: 122

Like
Likes
Like

Posted 20 February 2001 - 06:35 PM

A while ago someone made a post in the forums about how PASCAL has functions within functions and how neat it would be if C++ had that too. One reply to the thread was that you could declare a struct or a class inside a function, and it could have member functions. Of course as I read all that I said to myself "Why the #$&@? I would never want to do any such thing!" So today, as I was working on a tool, and pondering, ... and then I wrot this code:
  
void CChunkPackerApp::OnPopupChunkproperties() 
{
	// NOTE 1. Now this is really bizar! Why the C++ Language allows things like this, I don''t know!!!

	// This is a struct inside a function that inherits from a class... and its all valid syntax, and it works too.


	// NOTE 2. The PromptProperties() function needs to operate on the context of CChunkInfo, but 

	// CChunkInfo has no knowledge of property dialog boxes or the dialog templates or the resource IDs.

	
	struct CPropableChunkInfo : public CChunkInfo
	{
		void PromptProperties()
		{
			// Construct the dialog box

			CPropertySheet propSheet;
			CChunkPropPage1 propPage1;
			CChunkPropPage2 propPage2;

			// TODO: Set the data into the dialog

			

			// Hide the apply button and the help button

			propSheet.m_psh.dwFlags |= PSH_NOAPPLYNOW;
			propSheet.m_psh.dwFlags &= ~PSH_HASHELP;
			propPage1.m_psp.dwFlags &= ~PSP_HASHELP;  
			propPage2.m_psp.dwFlags &= ~PSP_HASHELP;  

			// Prompt the user to change the data

			propSheet.AddPage(&propPage1);
			propSheet.AddPage(&propPage2);
			propSheet.SetTitle( "Chunk Properties" );

			if( IDOK != propSheet.DoModal() )
				return;
			
			// TODO: Set My Data Members from the dialog.


		}
	};

	// Get the Selected Chunk

	CPropableChunkInfo* pci = (CPropableChunkInfo*)_GetWorkspaceDocument()->GetCurSelChunk();
	
	// Prompt the user for properties.

	if( pci != NULL )
		pci->PromptProperties();
}
  
Well, I guess I should never say never.

Sponsor:

#2 JD   Members   -  Reputation: 208

Like
Likes
Like

Posted 22 February 2001 - 02:44 PM

The struct has limits though so better check your c++ standard.

#3 Marsupial Rodentia   Members   -  Reputation: 122

Like
Likes
Like

Posted 22 February 2001 - 03:33 PM

I''m using MSVC++6 to make Win32 tools for my designers, and I use Metrowerks for the PSX2 for the game engine.

What are the limitations of struct? As far as I know, struct and class are exactly the same in C++, except that struct members by default are public, class members by default are private.

If I explicitly use public, private, and protected thoughout my class and struct declarations and never assume anything about defaults, I should be able to use struct and class keywords interchangably. Why would the compiler care?



#4 Shannon Barber   Moderators   -  Reputation: 1361

Like
Likes
Like

Posted 22 February 2001 - 06:27 PM

There''s a slight difference between the way pascal (& Delphi) handle embedded functions and they way C++ handles nested classes.

A nested class in C++ is a class just-the-same with a different scope (perhaps lifetime as well when nested inside a function). Whereas in pascal, an embedded function also has context, which means it can access variables in the parent function (without passing them in - it knows where it lives, so to speak).

Incidentally, pascal has no scope resolution operator (that I know of anyway), so if you declare a local variable with the same name as a parent variable, you can''t access the parent variable

It may be of little consequence, but I had to sit through a mind-numbingly boring class to learn that, so I feel compelled to spread the torment whenever I can

But you bring up an interesting point - you could make a local functor object (overload operator()) and voila! a nested function in C++. I''ll definetly remember that - I hate creating private methods for simple stuff that I do repetedly in a single function - and I''ll break out the trout if I hear anything about a macro . Thanks!

Magmai Kai Holmlor
- The disgruntled & disillusioned





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS