C++ 构造函数与实例化学习!

2016-07-14

在Ogre学习的Page75 中自己遇到一个问题,由于自己看的是英文的文档,自己对作者的理解有误,

(这是英文的原因,自己还是要多看英文的文档),因为理解错误,自己放了一个低级的错误,竟然

定义一个类时(其有两个构造函数,一个只带一个参数,另一个带来那个参数),实例化该类用一个

参数去实例化,呵呵,一直以为自己的c++ 学的还可以,今天知道了自己还要学学C++的基础。

调试代码好久,终于达到预期的效果,把源码记下,注释尽可能详细,有空在翻阅。

平台win32 :console应用程序:

Code:
  1. #include "Ogre/ExampleApplication.h"   
  2. #include "ExampleFrameListener.h"   
  3. #include "OIS.h"   
  4. #include <iostream>   
  5.   
  6. class Example27FrameListener :public Ogre::FrameListener   
  7. {   
  8. public:   
  9.   
  10.     Example27FrameListener(Ogre::SceneNode* node,RenderWindow * win)   
  11.     {   
  12.         //定义一个指向 渲染窗口的指针:win   
  13.         _node = node;   
  14.   
  15.         size_t  windowHnd = 0;   
  16.   
  17.         std::stringstream windowHndStr;   
  18.   
  19.         win->getCustomAttribute("WINDOW",&windowHnd);   
  20.         //把窗口句柄转换成字符串   
  21.         windowHndStr <<windowHnd;   
  22.         //为OIS创建参数列表,把窗口句柄插入到列表中   
  23.         OIS::ParamList pl;   
  24.            
  25.         pl.insert(std::make_pair(std::string("WINDOW"),windowHndStr.str()));   
  26.         //创建输入系统,并复制给_man   
  27.         _man = OIS::InputManager::createInputSystem(pl);   
  28.         //运用OIS键盘,获取用户输入   
  29.         _key = static_cast<OIS::Keyboard*>(_man->createInputObject(   
  30.             OIS::OISKeyboard,false));      
  31.     }   
  32.   
  33.   
  34.     bool frameStarted(const Ogre::FrameEvent &evt)   
  35.     {   
  36.         //捕获用户输入   
  37.         _key->capture();   
  38.         if (_key->isKeyDown(OIS :: KC_ESCAPE))   
  39.         {   
  40.             //如果用户按下Esc 停止渲染帧退出   
  41.             return false;   
  42.         }   
  43.         _node ->translate(Ogre::Vector3(10,0,0)*evt.timeSinceLastFrame);   
  44.   
  45.         return true;   
  46.     }   
  47.   
  48.     Example27FrameListener(Ogre::SceneNode node)   
  49.     {   
  50.   
  51.         FrameListener = NULL;   
  52.     }   
  53.     ~Example27FrameListener()   
  54.     {   
  55.         //销毁输入对象   
  56.         _man->destroyInputObject(_key);   
  57.         //销毁输入系统   
  58.         OIS::InputManager::destroyInputSystem(_man);   
  59.   
  60.         if (FrameListener)   
  61.         {   
  62.             delete FrameListener;   
  63.         }   
  64.     }   
  65.   
  66. private:   
  67.     Ogre::SceneNode* _node;   
  68.     Ogre::FrameListener* FrameListener;   
  69.     OIS::InputManager* _man;   
  70.     OIS::Keyboard* _key;   
  71. };   
  72.   
  73. class Example :public ExampleApplication   
  74. {   
  75. public :   
  76.     void createScene()//just realize virtual function createScene 就可以了   
  77.     {   
  78.         Ogre::Plane plane(Vector3::UNIT_Y,-10);   
  79.   
  80.         Ogre::MeshManager::getSingleton().createPlane("plane",   
  81.             ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,plane,   
  82.             1500,1500,200,200,true, 1,5,5,Vector3::UNIT_Z);   
  83.            
  84.         Ogre::Entity* ent =    
  85.             mSceneMgr->createEntity("LightPlaneEntity","plane");   
  86.   
  87.             //  Attation please; must add this dialog;   
  88.         mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);   
  89.   
  90.         ent->setMaterialName("Examples/BeachStones");   
  91.   
  92.         Ogre::Light* light = mSceneMgr->createLight("Light1");   
  93.         light->setType(Ogre::Light::LT_DIRECTIONAL);   
  94.         light->setDirection(Ogre::Vector3(1,-1,0));   
  95.   
  96.   
  97.         Ogre::SceneNode * node = mSceneMgr->createSceneNode("Node1");   
  98.         mSceneMgr->getRootSceneNode()->addChild(node);   
  99.   
  100.         Ogre::Entity* Sinbad = mSceneMgr->createEntity("Sinbad","Sinbad.mesh");   
  101.   
  102.         _SinbadNode = node->createChildSceneNode("SinbadNode");   
  103.         _SinbadNode->setScale(3.0f,3.0f,3.0f);   
  104.         _SinbadNode->setPosition(Ogre::Vector3( 0.0f, 4.0f, 0.0f));   
  105.         _SinbadNode->attachObject(Sinbad);   
  106.         mSceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_ADDITIVE);   
  107.   
  108.     }   
  109.     //  Overrode the createCamera () function    
  110.        
  111.     void createCamera()   
  112.     {   
  113.         mCamera = mSceneMgr->createCamera("MyCamera1");   
  114.         mCamera->setPosition(0,100,200);   
  115.         mCamera->lookAt(0,0,0);   
  116.         mCamera->setNearClipDistance(5);   
  117.     }   
  118.   
  119.     void createFrameListener( )   
  120.     {   
  121.         Example27FrameListener* Framelistener= new Example27FrameListener(_SinbadNode,mWindow);//就是在这里,依照类里定义的构造函数实例化   
  122.         mRoot->addFrameListener(Framelistener);   
  123.     }   
  124.   
  125.   
  126. private:   
  127.     Ogre::SceneNode* _SinbadNode;   
  128.   
  129.   
  130. };   
  131.   
  132. //  Listoner Framwork   
  133.   
  134. int main(void)   
  135. {   
  136.   
  137.     Example app;   
  138.     app.go();   
  139.     return 0;   
  140. }   

 STL小知识:

make_pair()函数的应用

template<class first, class second> inline

         pair<first, second> make_pair(const first& _X, const second& _Y)
   

     make_pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。 pair的实现是一个结构体,主要的两个成员变量是first second 因为是使用struct不是class,所以可以直接使用pair的成员变量。