参数传递

   在工程可能会遇到这样一个情况,底层的类需要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");


}



 

posted on 2016-10-10 17:37  从小白做起  阅读(297)  评论(0编辑  收藏  举报