home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   comp.lang.c++.moderated      Moderated discussion of C++ superhackery      33,346 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 33,299 of 33,346   
   frank67x@googlemail.com to All   
   valid code for "procedural inheritance"?   
   27 Mar 14 10:39:48   
   
   i yet didn't test for recursions - but is this valid code?   
   ================================================================   
   #include    
      
   template    
   void   
   exec2(   
   	CALLER & caller)   
   {   
   	struct Me : public CALLER   
   	{   
   	public:   
   		Me(CALLER & caller)   
   		: CALLER(caller)   
   		{ };   
      
   		Me(Me const & me)   
   		: CALLER(me)   
   		{ };   
      
   		void   
   		exec()   
   		{   
   			std::cerr << "exec2::Me::exec(): invoked" << std::endl;   
   			std::cerr << "exec2::Me::exec(): this->y = " << this->y << std::endl;   
   			std::cerr  << "exec2::Me::exec(): this->x = " << this->x << " (before   
   update)" << std::endl;   
   			this->x = 7;   
   			std::cerr << "exec2::Me::exec(): this->x = " << this->x << " (after   
   update)" << std::endl;   
   			this->logSomething();   
   		}   
   	} me(caller);   
      
   	return me.exec();   
   }   
      
   template    
   void   
   exec1(   
   	CALLER & caller)   
   {   
   	struct Me : public CALLER   
   	{   
   	private:   
   		int _y = 42;   
   	public:   
   		int &y; // reference to pass on for the call levels   
      
   		Me(Me const & me)   
   		: CALLER(me),   
   		  y(me.y)   
   		{ };   
      
   		Me(CALLER & caller)   
   		: CALLER(caller),   
   		  y(_y)   
   		{ };   
      
   		void   
   		exec()   
   		{   
   			std::cerr << "exec1::Me::exec(): invoked" << std::endl;   
   			std::cerr << "exec1::Me::exec(): caller.x = " << this->x << std::endl;   
   			exec2(*this);   
   			std::cerr << "exec1::Me::exec(): caller.x = " << this->x << std::endl;   
   		}   
      
   		void logSomething()   
   		{   
   			CALLER::logSomething();   
   			std::cerr << "hello, world again!" << std::endl;   
   		}   
   	} me(caller);   
      
   	std::cerr << "exec1::me = " << (long)&me << std::endl;   
      
   	return me.exec();   
   }   
      
   int   
   main(   
   	int,   
   	char**)   
   {   
   	struct Me   
   	{   
   	private:   
   		int _x = 5;   
   	public:   
   		int &x; // reference to pass on for the call levels   
      
   		Me()   
   		: x(_x)   
   		{ };   
      
   		Me(Me const & me)   
   		: x(me.x)   
   		{ }   
      
   		void   
   		exec()   
   		{   
   			return exec1(*this);   
   		}   
      
   		void logSomething()   
   		{   
   			std::cerr << "hello, world!" << std::endl;   
   		}   
   	} me;   
      
   	std::cerr << "main::me = " << (long)&me << std::endl;   
   	std::cerr << "main::Me::x = " << me.x << " (before me.exec(me))" << std::endl;   
   	me.exec();   
   	std::cerr << "main::Me::x = " << me.x << " (after me.exec(me))" << std::endl;   
      
   	return 0;   
      
   }   
      
      
   --   
         [ See http://www.gotw.ca/resources/clcm.htm for info about ]   
         [ comp.lang.c++.moderated.    First time posters: Do this! ]   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca