zoukankan      html  css  js  c++  java
  • 参数传递

       在工程可能会遇到这样一个情况,底层的类需要main函数中传参数。但是考虑到系统功能的设计,底层的类又不能直接定义在main函数中,因为底层的类是嵌套在顶层的类里面的,实现相应的功能需要顶层的类的中间结果。

     这个时候我们怎样实现把main函数中的参数传给底层的类呢?

    下面来看一个例子:为了简单起见,我一共写了两个简单的类,一个是类A,为顶层类、另一个是类B,为底层类。

    classA.h

    #include<iostream>
    #include"classB.h"
    using namespace std;
    namespace TOPLEVEL
    {
    	class A
    	{  public:
    		A(int pa1_);
    		~A();
    		void process_system();
    		void printa();
    		int pa1;
    		B *b;
    
    	};
    }


    classA.cpp

    #include"classA.h"
    namespace TOPLEVEL
    {
    	A::A(int pa1_):pa1(pa1_)
    	  {
    		b=new B(0,5);
    	  }
    	A::~A()
    	  {
    		delete b;
    	  }
    	void A::process_system()
    	  {
    		    pa1+=2;
    	   }
    	void A::printa()
    	  {  
    		  process_system();
    		cout<<"sum :"<<b->sum(pa1)<<endl;			
    	  }
    }


    
    
    

    classB.h

    #include<iostream>
    using namespace std;
    namespace TOPLEVEL
    {
    class B
    	{  public:
    		B(int pb1_,int pb2_);
    		 ~B(){};
    		int sum(int in);
    		int pb1,pb2;   
    
    	};
    }


    classB.cpp

    #include"classB.h"
    namespace TOPLEVEL
    {
    	B::B(int pb1_,int pb2_):pb1(pb1_),pb2(pb2_)
    	 {}
     int B::sum(int in)
      {
    	return in+pb2;
    
      }
    }


    main.cpp

    #include<iostream>
    #include<string>
    #include"classA.h"
    
    using namespace std;
    using namespace TOPLEVEL;
    int main(int argc,char **argv)
    {
    	/*-----------------------读取参数,并转化成bool类型选择开关choose_botton----------*/
    	if(argc!=2)
    	{
    		cout<<"parameter num must be one,please check the parameter"<<endl;
    		return -1;
    	}
    	
    	string para=argv[1];
    	string tmp="true";
    	bool choose_botton=false;
    
    	if(para==tmp)  
        choose_botton=true;
    	 
    	 
    
         int num1=10;
    	TOPLEVEL::A *a=new TOPLEVEL::A(num1);
    	a->printa();
    	delete a;
    	system("pause");
    
    
    }

      问题是这样的:假如我们想通过输入参数来 控制classB里的加法输出结果是可调的,要么是pb1+pa1,要么是pb2+pa1,怎么传参数呢?即怎样把choose_botton传给类B呢?


        方法一  通过构造函数逐级往里传,这个方法是比较笨的方法,因为需要修改全部的构造函数,如果工程比较庞大,这么做不太可取,因为还肯有其他地方用到classB,如果这样改,其他实例化classB的地方都要修改。

        方法二 通过在顶层类(A)里定义静态数据成员,通过静态数据成员传参数。注意,这里涉及到嵌套类的前置声明问题。

        方法三 通过全局变量传参数。


      方法一:

         classA.h

    #include<iostream>
    #include"classB.h"
    using namespace std;
    namespace TOPLEVEL
    {
    	class A
    	{  public:
    		A(int pa1_,bool button);////////////修改构造函数声明
    		~A();
    		void process_system();
    		void printa();
    		int pa1;
    
    		B *b;
    
    	};
    }

         classA.cpp

    #include"classA.h"
    namespace TOPLEVEL
    {
    	A::A(int pa1_,bool botton):pa1(pa1_)
    	  {
    		b=new B(0,5,botton);//传入内层构造函数
    	  }
    	A::~A()
    	  {
    		delete b;
    	  }
    	void A::process_system()
    	  {
    		    pa1+=2;
    	   }
    	void A::printa()
    	  {  
    		  process_system();
    		cout<<"sum :"<<b->sum(pa1)<<endl;			
    	  }
    }


    classB.h

    #include<iostream>
    using namespace std;
    namespace TOPLEVEL
    {
    class B
    	{  public:
    		B(int pb1_,int pb2_,bool botton_);//修改构造函数声明
    		 ~B(){};
    		bool botton;//传给内层参数
    		int sum(int in);
    		int pb1,pb2;   
    
    	};
    }

    classB.cpp

    #include"classB.h"
    namespace TOPLEVEL
    {
    	B::B(int pb1_,int pb2_,bool botton_):pb1(pb1_),pb2(pb2_),botton(botton_)//修改构造函数定义
    	 {}
     int B::sum(int in)
      {
    	  if(botton)
    	return in+pb2;
    	  else
             return in+pb1;
    
      }
    }


    main.cpp

    #include<iostream>
    #include<string>
    #include"classA.h"
    
    using namespace std;
    using namespace TOPLEVEL;
    int main(int argc,char **argv)
    {
    	/*-----------------------读取参数,并转化成bool类型选择开关choose_botton----------*/
    	if(argc!=2)
    	{
    		cout<<"parameter num must be one,please check the parameter"<<endl;
    		return -1;
    	}
    	
    	string para=argv[1];
    	string tmp="true";
    	bool choose_botton=false;
    
    	if(para==tmp)  
        choose_botton=true;
    	 
    	 
    
         int num1=10;
    	TOPLEVEL::A *a=new TOPLEVEL::A(num1,choose_botton);//传入最外层参数
    	a->printa();
    	delete a;
    	system("pause");
    
    
    }

      方法二:

    classA.h

    #ifndef CLASSA_
    #define CLASSA_//防止重复包含
    
    #include<iostream>
    #include"classB.h"
    
    using namespace std;
    namespace TOPLEVEL
    {      class B;//类前置声明
     	class A
    	{  public:
    		A(int pa1_);
    		~A();
    		void process_system();
    		void printa();
    		int pa1;
    		static bool botton;//声明静态变量
    		B *b;
    
    	};
    }
    <strong>#endif</strong>


    classA.cpp

    #include"classA.h"
    namespace TOPLEVEL
    {
    	A::A(int pa1_):pa1(pa1_)
    	  {
    		b=new B(0,5);
    	  }
    	A::~A()
    	  {
    		delete b;
    	  }
    	void A::process_system()
    	  {
    		    pa1+=2;
    	   }
    	void A::printa()
    	  {  
    		  process_system();
    		cout<<"sum :"<<b->sum(pa1)<<endl;			
    	  }
    	bool A::botton=false;//定义静态变量
    }


    classB.h

    #ifndef CLASSB_
    #define CLASSB_//防止重复包含
    
    #include<iostream>
    #include"classA.h"//
    using namespace std;
    namespace TOPLEVEL
    {
    	class A;//前置声明
            class B
    	{  public:
    		B(int pb1_,int pb2_);
    		 ~B(){};
    		int sum(int in);
    		int pb1,pb2;   
    
    	};
    }
    #endif


    classB.cpp

    #include"classB.h"
    
    namespace TOPLEVEL
    {
      B::B(int pb1_,int pb2_):pb1(pb1_),pb2(pb2_)
    	 {}
     int B::sum(int in)
      {
    	 if(A::botton)//实现
    	return in+pb2;
    	  else
           return in+pb1;
    
      }
    }


    main.cpp

    #include<iostream>
    #include<string>
    #include"classA.h"
    using namespace std;
    using namespace TOPLEVEL;
    int main(int argc,char **argv)
    {
    	/*-----------------------读取参数,并转化成bool类型选择开关choose_botton----------*/
    	if(argc!=2)
    	{
    		cout<<"parameter num must be one,please check the parameter"<<endl;
    		return -1;
    	}
    	
    	string para=argv[1];
    	string tmp="true";
    	bool choose_botton=false;
    
    	   if(para==tmp)		
           A::botton=true;//修改静态变量
    	
    
         int num1=10;
    	TOPLEVEL::A *a=new TOPLEVEL::A(num1);
    	a->printa();
    	delete a;
    	system("pause");
    
    
    }


    方法三:

    classA.h

    #include<iostream>
    #include"classB.h"
    
    using namespace std;
    namespace TOPLEVEL
    {  
    	class A
    	{  public:
    		A(int pa1_);
    		~A();
    		void process_system();
    		void printa();
    		int pa1;
    		B *b;
    
    	};
    }

    classA.cpp

    #include"classA.h"
    
    namespace TOPLEVEL
    {
    	A::A(int pa1_):pa1(pa1_)
    	  {
    		b=new B(0,5);
    	  }
    	A::~A()
    	  {
    		delete b;
    	  }
    	void A::process_system()
    	  {
    		    pa1+=2;
    	   }
    	void A::printa()
    	  {  
    		  process_system();
    		cout<<"sum :"<<b->sum(pa1)<<endl;			
    	  }
    }

    classB.h

    #include<iostream>
    using namespace std;
    namespace TOPLEVEL
    {
    	
      class B
    	{  public:
    		B(int pb1_,int pb2_);
    		 ~B(){};
    		int sum(int in);
    		int pb1,pb2;   
    
    	};
    }
    
    



    classB.cpp

    #include"classB.h"
     extern bool button;//全局变量
    namespace TOPLEVEL
    {
       B::B(int pb1_,int pb2_):pb1(pb1_),pb2(pb2_)
    	 {}
     int B::sum(int in)
      {
    	 if(button)//实现
    	return in+pb2;
    	  else
           return in+pb1;
    
      }
    }

    main.cpp

    #include<iostream>
    #include<string>
    #include"classA.h"
    using namespace std;
    using namespace TOPLEVEL;
     bool button;//定义全局变量
    int main(int argc,char **argv)
    {
    	/*-----------------------读取参数,并转化成bool类型选择开关choose_botton----------*/
    	if(argc!=2)
    	{
    		cout<<"parameter num must be one,please check the parameter"<<endl;
    		return -1;
    	}
    	
    	string para=argv[1];
    	string tmp="true";
    	
    	   if(para==tmp)
    		button=true;//赋值
    
         int num1=10;
    	TOPLEVEL::A *a=new TOPLEVEL::A(num1);
    	a->printa();
    	delete a;
    	system("pause");
    
    
    }



  • 相关阅读:
    ORA-01940: cannot drop a user that is currently connected
    三分钟入门VyOS网络操作系统
    金笛短信猫发短信一段时间后,停止发送
    ORA-01940 无法删除当前已连接的用户之解决方案
    Table is marked as crashed and should be repaire (
    DirectConnect API
    使用 ElasticSearch Aggregations 进行统计分析
    Cocos2d-x学习笔记(四) 布景层的加入移除
    Spark源代码阅读笔记之DiskStore
    一个搜索迷宫出路的程序
  • 原文地址:https://www.cnblogs.com/zhubaohua-bupt/p/7182823.html
Copyright © 2011-2022 走看看