.[ ČeskéHry.cz ].
potrebujem poradit s konštruktorom (C++)

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
koso



Založen: 28. 05. 2009
Příspěvky: 110

PříspěvekZaslal: 5. leden 2010, 12:18:11    Předmět: potrebujem poradit s konštruktorom (C++) Odpovědět s citátem

v jednom cpp súbore mám vytvorenú triedu takto
kód:
class DemoListener : public ExampleFrameListener, public OIS::MouseListener, public OIS::KeyListener

rovno v tom súbore sú aj zadefinované všetky jej fcie a konštruktor vyzerá takto
kód:
DemoListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer, ET::TerrainManager* terrainMgr, ET::SplattingManager* splatMgr)
    : ExampleFrameListener(win, cam, true, true), mGUIRenderer(renderer), mTerrainMgr(terrainMgr), mTerrainInfo(&terrainMgr->getTerrainInfo()), mSplatMgr(splatMgr)
    {

rovno v tom súbore sú jej fcie použité v inej triede.
ja sa pokúšam spraviť túto triedu do samostatného .cpp a .h súboru aby som ju mohol používať aj mimo toho prvého.nedarí sa mi to ale skompilovať.
moja definicia v .h súbore je takáto

kód:
class DemoListener : public ExampleFrameListener, public OIS::MouseListener, public OIS::KeyListener
{
public:
   DemoListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer,
      ET::TerrainManager* terrainMgr, ET::SplattingManager* splatMgr);
   
   ~DemoListener();
...}

potom v mojom cpp zavolám konštruktor aby som nastavil premenné
kód:
DemoListener::DemoListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer, ET::TerrainManager* terrainMgr, ET::SplattingManager* splatMgr)
    : ExampleFrameListener(win, cam, true, true), mGUIRenderer(renderer), mTerrainMgr(terrainMgr), mTerrainInfo(&terrainMgr->getTerrainInfo()), mSplatMgr(splatMgr)
    {


stále mám problém s definíciou konštruktora v .h súbore. kompiler stále vypisuje error.
mohol by mi niekto poradit ako by mal vyzerať konštruktor v mojom .h súbore, podla pôvodného(to je ten prvý kód)

vopred ďakujem
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Sirall



Založen: 02. 08. 2007
Příspěvky: 68
Bydliště: Praha 4 Nusle

PříspěvekZaslal: 5. leden 2010, 14:23:47    Předmět: Re: potrebujem poradit s konštruktorom (C++) Odpovědět s citátem

Co ti kompiler hlásí za chybu?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
koso



Založen: 28. 05. 2009
Příspěvky: 110

PříspěvekZaslal: 5. leden 2010, 15:01:36    Předmět: Odpovědět s citátem

terrainediting.cpp : error C2511: 'terrainEditingListener::terrainEditingListener(Ogre::RenderWindow *,Ogre::Camera *,Ogre::SceneManager *,CEGUI::Renderer *,ET::TerrainManager *,ET::SplattingManager *)' : overloaded member function not found in 'terrainEditingListener'
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Sirall



Založen: 02. 08. 2007
Příspěvky: 68
Bydliště: Praha 4 Nusle

PříspěvekZaslal: 5. leden 2010, 15:11:35    Předmět: Odpovědět s citátem

Možná jsem blázen, ale chyba je na první pohled jinde, než třída kterou uvádíš. Podle chyby bych řekl, že ve třídě terrainEditingListener, ti schází konstruktor s parametry (Ogre::RenderWindow *,Ogre::Camera *,Ogre::SceneManager *,CEGUI::Renderer *,ET::TerrainManager *,ET::SplattingManager *). Z toho co jsi uvedl, ale nevidím přímou souvislost s tvou třídou DemoListener.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
koso



Založen: 28. 05. 2009
Příspěvky: 110

PříspěvekZaslal: 5. leden 2010, 15:40:57    Předmět: Odpovědět s citátem

ospravedlnujem sa, ta trieda terrainEditingListener je vlastne DemoListener.
predtym ako som sem posielal ten error som to poprepisoval. Prosim, skus sa na to pozriet tak ze vlastne mas triedu v cpp subore definovanu, vytvorenua jej fcie pouziva hned ina trieda v tom istom subore.
Chces ju ale spravit tak aby si si ju mohol naincludovat do inych projektov. co by si dal do konstruktora v .h subore? vychadzaj pritom z prveho kodu v prvom prispevku.to je ta trieda iba v .cpp subore
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Sirall



Založen: 02. 08. 2007
Příspěvky: 68
Bydliště: Praha 4 Nusle

PříspěvekZaslal: 5. leden 2010, 16:09:58    Předmět: Odpovědět s citátem

V tom tvém zápisu chybu nevidím, nejsou tam ale informace o includech atp. Každopádně správný zápis by měl vypadat např takto:

class.h:
kód:
class A
{
public:
   A(int a);
};

class B
{
public:
   B();
};

class C
{
public:
   C(int c);
};

class D : public A, public B, public C
{
   int* v1;
   int* v2;
   int* v3;

public:
   D(int* v1, int* v2, int* v3);
   ~D();

   void test();
};


class.cpp:
kód:
#include "class.h"

A::A(int a)
{
}

B::B()
{
}

C::C(int c)
{
}

D::D(int* v1, int* v2, int* v3) : A(0), B(), C(0), v1(v1), v2(v2), v3(v3)
{
   //...
}

D::~D()
{
   //...
}

void D::test()
{
   // ..
}


Edit: Normálně bych tedy měl každou třídu v jiném souboru, to ale je analogie. Musí se to jen správně naincludovat.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
koso



Založen: 28. 05. 2009
Příspěvky: 110

PříspěvekZaslal: 5. leden 2010, 16:22:37    Předmět: Odpovědět s citátem

neviem si s tym poradit. tu je moj terrainEditing.h:

kód:
#ifndef __TERRAINEDITING_H__
#define __TERRAINEDITING_H__

#include <OgreNoMemoryMacros.h>
#include <CEGUI/CEGUISystem.h>
#include <CEGUI/CEGUISchemeManager.h>
#include <OgreCEGUIRenderer.h>

#include "ExampleApplication.h"

#include "ETTerrainManager.h"
#include "ETTerrainInfo.h"
#include "ETBrush.h"
#include "ETSplattingManager.h"

using namespace std;
using Ogre::uint;

class terrainEditingListener : public ExampleFrameListener, public OIS::MouseListener, public OIS::KeyListener
{
public:
   terrainEditingListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer, ET::TerrainManager* terrainMgr, ET::SplattingManager* splatMgr);
   
   ~terrainEditingListener();
   void createEditBrush();
   bool frameStarted(const FrameEvent &evt);
   virtual bool mousePressed( const OIS::MouseEvent &arg, OIS::MouseButtonID id );
   virtual bool mouseReleased( const OIS::MouseEvent &arg, OIS::MouseButtonID id );
   virtual bool mouseMoved( const OIS::MouseEvent &arg );
   virtual bool keyPressed(const OIS::KeyEvent& arg);
   virtual bool keyReleased(const OIS::KeyEvent& arg);
   void saveTerrain();
   void loadTerrain();
   void updateLightmap();

   protected:
    RaySceneQuery *mRaySceneQuery;     //ray scene query pointer
    bool mLMouseDown, mRMouseDown;     //true ak je tlacitko stlacene
    bool mMMouseDown;
    SceneManager *mSceneMgr;           //pointer na scene manager
    SceneNode *mPointer;               //pointer na terrain
    CEGUI::Renderer *mGUIRenderer;     //cegui renderer
    ET::Brush mEditBrush;              //stetec na terrain editing
    bool mDeform;                      //indikuje ktory mod pouzivame(deform , paint)
    uint mChosenTexture;                //ktora zo 4 textures je pouzivana?

    //pohyb
    Vector3 mDirection;
    bool mMove;

    SceneNode* mCamNode;

    bool mContinue;

    ET::TerrainManager* mTerrainMgr;
    const ET::TerrainInfo* mTerrainInfo;
    ET::SplattingManager* mSplatMgr;
};

#endif


a tu je terrainEditing.cpp
kód:

#include "terrainEditing.h"

terrainEditingListener::terrainEditingListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer, ET::TerrainManager* terrainMgr, ET::SplattingManager* splatMgr)
    : ExampleFrameListener(win, cam, true, true), mGUIRenderer(renderer), mTerrainMgr(terrainMgr), mTerrainInfo(&terrainMgr->getTerrainInfo()), mSplatMgr(splatMgr)
    {
      //zakladne premenne
      mPointer = NULL;
      mLMouseDown = false;
      mRMouseDown = false;
      mMMouseDown = false;
      mSceneMgr = sceneManager;

      //rychlost pohybu
      mMoveSpeed = 320;
      mRotateSpeed *= 0.008;

      //registracia udalosti(eventov)
      mMouse->setEventCallback( this );
      mKeyboard->setEventCallback(this);

      //vytvori RaySceneQuery
      mRaySceneQuery = mSceneMgr->createRayQuery( Ray() );

      //vytvori pointer pre pracu z terenom
      Entity* pointer = mSceneMgr->createEntity("Pointer", "ogrehead.mesh");
      mPointer = mSceneMgr->getRootSceneNode()->createChildSceneNode();
      mPointer->attachObject(pointer);

      //inicializuje poziciu CEGUI kurzora
      CEGUI::MouseCursor::getSingleton().setPosition(CEGUI::Point(CEGUI::Vector2(0,0)));

      createEditBrush();
      mDeform = true;
      mChosenTexture = 0;

      mDirection = Vector3::ZERO;

      mContinue = true;

      mCamNode = mCamera->getParentSceneNode();
    }
terrainEditingListener::~terrainEditingListener( )
{
   delete mRaySceneQuery;
}
terrainEditingListener::createEditBrush()
{
   // load the edit brush for terrain editing
     Image image;
     image.load("brush.png", "ET");
     image.resize(16, 16);
     mEditBrush = ET::loadBrushFromImage(image);
}
terrainEditingListener::frameStarted(const FrameEvent &evt)
{
   if (!ExampleFrameListener::frameStarted( evt ))
        return false;

      // handle movement
      mCamNode->translate(mCamera->getOrientation()*mDirection*mMoveSpeed*evt.timeSinceLastFrame);

      // Ensure we stay above terrain (somehow buggy still, doesn't work reliably)
      Vector3 camPos = mCamNode->getPosition( );
      // get terrain height at camPos
      float terrainHeight = mTerrainInfo->getHeightAt(camPos.x, camPos.z);
      if ((terrainHeight + 30.0f) > camPos.y)
        mCamNode->setPosition(camPos.x, terrainHeight+30.0f, camPos.z);

      if (mLMouseDown || mRMouseDown)
      {
        // deform or paint terrain on mouse down
        // left button raises, right button lowers
        if (mDeform)
        {
          // choose a brush intensity, this determines
          // how extreme our brush works on the terrain
          float brushIntensity = evt.timeSinceLastFrame * 0.2 * (mLMouseDown? 1 : -1);
          // translate our cursor position to vertex indexes
          Vector3 deformPos = mPointer->getPosition();
          int x = mTerrainInfo->posToVertexX(deformPos.x);
          int z = mTerrainInfo->posToVertexZ(deformPos.z);
          // now tell the ETM to deform the terrain
          mTerrainMgr->deform(x, z, mEditBrush, brushIntensity);
        }
        else
        {
          // need to set our brush intensity larger for painting.
          // for painting, all texture channels are only 1 byte
          // large, so with a small intensity you won't get any
          // effect at all.
          float brushIntensity = evt.timeSinceLastFrame * 5.0 * (mLMouseDown? 1 : -1);
          // retrieve edit points
          Vector3 paintPos = mPointer->getPosition();
          int x = mTerrainInfo->posToVertexX(paintPos.x);
          int z = mTerrainInfo->posToVertexZ(paintPos.z);
          // now use the splatting manager to update the coverage maps
          mSplatMgr->paint(mChosenTexture, x, z, mEditBrush, brushIntensity);
        }
      }
      return mContinue;
}
terrainEditingListener::mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID id)
{
   // Left mouse button down
     if ( id == OIS::MB_Left )
     {
       mLMouseDown = true;
     }
     // Middle mouse button down
     else if ( id == OIS::MB_Middle )
     {
       CEGUI::MouseCursor::getSingleton().hide( );
       mMMouseDown = true;
     }

     else if (id == OIS::MB_Right)
     {
       mRMouseDown = true;
     }

     return true;
}
terrainEditingListener::mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID id)
{
   // Left mouse button up
     if ( id == OIS::MB_Left )
     {
       mLMouseDown = false;
       // after completed deformation steps, recalculate the lightmap
       if (mDeform)
         updateLightmap();
     }

     // Middle mouse button up
     else if ( id == OIS::MB_Middle )
     {
       CEGUI::MouseCursor::getSingleton().show( );
       mMMouseDown = false;
     }

     else if (id == OIS::MB_Right)
     {
       mRMouseDown = false;
       // after completed deformation steps, recalculate the lightmap
       if (mDeform)
         updateLightmap();
     }

     return true;
}
terrainEditingListener::mouseMoved(const OIS::MouseEvent &arg)
{
   // Update CEGUI with the mouse motion
     CEGUI::System::getSingleton().injectMouseMove( arg.state.X.rel, arg.state.Y.rel );

     // whenever the mouse is moved, we update the position on the
     // terrain to which the mouse is currently pointing
     Ray mouseRay = mCamera->getCameraToViewportRay(arg.state.X.abs/float(arg.state.width), arg.state.Y.abs/float(arg.state.height));
     // since ETM is no longer a scene manager, we don't use a ray scene query,
     // but instead query the terrain info directly
     std::pair<bool, Vector3> result = mTerrainInfo->rayIntersects(mouseRay);
     if (result.first)
     {
       // update pointer's position
       mPointer->setPosition(result.second);
     }

     // If we are dragging the middle mouse button.
     if ( mMMouseDown )
     {
       mCamera->yaw( Degree(-arg.state.X.rel * mRotateSpeed) );
       mCamera->pitch( Degree(-arg.state.Y.rel * mRotateSpeed) );
     }

     return true;
}
terrainEditingListener::keyPressed(const OIS::KeyEvent &arg)
{
   // we'll use the keys 1, 2, 3, 4 and E to switch between
     // edit modes and select a paint texture
     // WSAD is used for movement
     // O will save the changes to disk
     switch (arg.key)
     {
     case OIS::KC_1:
       mDeform = false;
       mChosenTexture = 0;
       return true;
     case OIS::KC_2:
       mDeform = false;
       mChosenTexture = 1;
       return true;
     case OIS::KC_3:
       mDeform = false;
       mChosenTexture = 2;
       return true;
     case OIS::KC_4:
       mDeform = false;
       mChosenTexture = 3;
       return true;
     case OIS::KC_5:
       mDeform = false;
       mChosenTexture = 4;
       return true;
     case OIS::KC_6:
       mDeform = false;
       mChosenTexture = 5;
       return true;
     case OIS::KC_E:
       mDeform = true;
       return true;

     case OIS::KC_W:
       mDirection.z += -1;
       return true;
     case OIS::KC_S:
       mDirection.z += 1;
       return true;
     case OIS::KC_A:
       mDirection.x += -1;
       return true;
     case OIS::KC_D:
       mDirection.x += 1;
       return true;

//     case OIS::KC_O:
//       saveTerrain();
//       return true;

//     case OIS::KC_P:
//       loadTerrain();
//       return true;

     case OIS::KC_ESCAPE:
       mContinue = false;
       return true;

     default:
       return false;
     }
}
terrainEditingListener::keyReleased(const OIS::KeyEvent &arg)
{
   // not interested in this
     switch (arg.key)
     {
     case OIS::KC_W:
       mDirection.z -= -1;
       return true;
     case OIS::KC_S:
       mDirection.z -= 1;
       return true;
     case OIS::KC_A:
       mDirection.x -= -1;
       return true;
     case OIS::KC_D:
       mDirection.x -= 1;
       return true;

     default:
       return false;
     }
}
terrainEditingListener::saveTerrain()
{
   // just for demonstration, we'll save anything we can
     // start with the terrain
     Image image;
     ET::saveHeightmapToImage(*mTerrainInfo, image);
     image.save("../../Media/ET/ETterrain.png");

     // now save the splatting maps
     for (uint i = 0; i < mSplatMgr->getNumMaps(); ++i)
     {
       mSplatMgr->saveMapToImage(i, image);
       image.save("../../Media/ET/ETcoverage."+StringConverter::toString(i)+".png");
     }

     // now the lightmap
     Image lightmap;
     ET::createTerrainLightmap(*mTerrainInfo, lightmap, 512, 512, Vector3(1, -1, 1), ColourValue(1,1,1),
       ColourValue(0.3, 0.3,  0.3));
     lightmap.save("../../Media/ET/ETlightmap.png");

     // generate a base texture for this terrain (could be used for older hardware instead of splatting)
     // create an ImageList of our splatting textures.
     ET::ImageList textures (6);
     for (int i = 0; i < 6; ++i)
       textures[i].load("splatting"+StringConverter::toString(i)+".png", "ET");
     // create the base texture
     Image baseTexture;
     mSplatMgr->createBaseTexture(baseTexture, 512, 512, textures, 20, 20);
     baseTexture.save("../../Media/ET/ETbase.png");

     // finally create a minimap using the lightmap and the generated base texture
     Image minimap = ET::createMinimap(baseTexture, lightmap);
     minimap.save("../../Media/ET/ETminimap.png");
}
terrainEditingListener::loadTerrain()
{
   // now we revert the process and load the data back from disk
     // recreate terrain...
     mTerrainMgr->destroyTerrain();
     Image image;
     image.load("ETterrain.png", "ET");
     ET::TerrainInfo info;
     ET::loadHeightmapFromImage(info, image);
     info.setExtents(AxisAlignedBox(0, 0, 0, 1500, 300, 1500));
     mTerrainMgr->createTerrain(info);
     mTerrainInfo = & mTerrainMgr->getTerrainInfo();

     // now load the splatting maps
     for (uint i = 0; i < mSplatMgr->getNumMaps(); ++i)
     {
       image.load("ETcoverage."+StringConverter::toString(i)+".png", "ET");
       mSplatMgr->loadMapFromImage(i, image);
     }

     // update the lightmap
     updateLightmap();
}
terrainEditingListener::updateLightmap()
{
   Image lightmap;
     ET::createTerrainLightmap(*mTerrainInfo, lightmap, 128, 128, Vector3(1, -1, 1), ColourValue(1,1,1),
       ColourValue(0.3, 0.3,  0.3));

     // get our dynamic texture and update its contents
     TexturePtr tex = TextureManager::getSingleton().getByName("ETLightmap");
     tex->getBuffer(0, 0)->blitFromMemory(lightmap.getPixelBox(0, 0));
}


prosim mrkni sa na to. neviem co s tym
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Deluxe



Založen: 31. 07. 2007
Příspěvky: 235
Bydliště: Oslavany

PříspěvekZaslal: 5. leden 2010, 16:46:31    Předmět: Odpovědět s citátem

Nemohl by byt problem ze ve tvym kodu nespecifikujes namespace? neni rozdil mezi RenderWindow a Ogre::RenderWindow...?
Mas tam sice "using Ogre::uint" ale tim importujes jen typ uint.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Sirall



Založen: 02. 08. 2007
Příspěvky: 68
Bydliště: Praha 4 Nusle

PříspěvekZaslal: 5. leden 2010, 16:56:25    Předmět: Odpovědět s citátem

Tak nevím, když si ty třídy nahradím, tak mi to funguje. Řekl může být problém s namespace, které používáš v header souboru - já osobně dávám v header souborech celou cestu, tj. místo using Ogre::uint píšu všude Ogre::uint a using používám jen v cpp.

Jiný problém mě nenapadá Confused
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Sirall



Založen: 02. 08. 2007
Příspěvky: 68
Bydliště: Praha 4 Nusle

PříspěvekZaslal: 5. leden 2010, 16:56:59    Předmět: Odpovědět s citátem

Deluxe napsal:
Nemohl by byt problem ze ve tvym kodu nespecifikujes namespace? neni rozdil mezi RenderWindow a Ogre::RenderWindow...?
Mas tam sice "using Ogre::uint" ale tim importujes jen typ uint.


Heh, byl jsem předběhnut Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
koso



Založen: 28. 05. 2009
Příspěvky: 110

PříspěvekZaslal: 5. leden 2010, 17:07:16    Předmět: Odpovědět s citátem

ja som si myslel ze som idiot ale ja som megaidiot Confused . V terrainEditing.cpp som nemal pred vsetkymi fciami napisany datovy typ Very Happy .
mam vsak este jeden problem.NWM co je entry point takze ani nwm ako ho definovat.tipujem ze je to niekde v project properities.mozete mi este ozrejmit toto.
kód:
1>LINK : fatal error LNK1561: entry point must be defined
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Sirall



Založen: 02. 08. 2007
Příspěvky: 68
Bydliště: Praha 4 Nusle

PříspěvekZaslal: 5. leden 2010, 17:12:05    Předmět: Odpovědět s citátem

Heh, též jsem si nevšiml Laughing Podle chyby jsem se zaměřil na konstruktor.

S aktuální chybou je lehké pořízení, schází ti v aplikaci main Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 5. leden 2010, 17:13:07    Předmět: Odpovědět s citátem

ze by

kód:
int main() {}


?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Deluxe



Založen: 31. 07. 2007
Příspěvky: 235
Bydliště: Oslavany

PříspěvekZaslal: 5. leden 2010, 17:14:09    Předmět: Odpovědět s citátem

nebo mozna WinMain(...)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna