Классы

Тема в разделе "Общие вопросы по С и С++", создана пользователем GRAMER, 17 июл 2007.

Статус темы:
Закрыта.
  1. GRAMER

    GRAMER Гость

    Здравствуйте
    Простая проблемка в классах, объясню суть.
    Я создал 2 класса и они между собой почему то не могут передавать значения.
    (Для примера вот два класса Car и Move, у класса Car есть переменная int speed)
    если я в какой ни будь функции класса Move присвою переменной speed класса Car значение, то она не присваивается, как будто этого не было.
    Почему так подскажите пожалуйста
     
  2. Pasha

    Pasha Гость

    Для: sax_ol
    Да, и надо еще подправить 25-ю и 49-ю, чтобы ворнингов не было.
     
  3. Over

    Over Well-Known Member

    Регистрация:
    4 июл 2007
    Сообщения:
    116
    Симпатии:
    0
    Во-первых. Почитай умные книжки про классы.
    Во-вторых. Посмотри, как у тебя задан доступ к переменным внутри класса? PUBLIC, PROTECTED или PRIVATE?
    В-третьих. Происходит ли у тебя наследование, проверь правильно ли ты обращаешься к той переменной.

    P.S. Обычно все переменные внутри классов делают PRIVATE, а для работы с их значениями прописывают функции GetValue и SetValue, которые, соответственно, возвращают и присваивают значение внутренней переменной.
     
  4. GRAMER

    GRAMER Гость

    Спасибо за совет попробую, в MFC почему то всё нормально работает.
    Я конечно могу скинуть код, но там очень много по этому не стал.
    Самое главное что я заметил если все функции классов Move и Car разложить в разные файлы (Move.cpp) (Car.cpp) тогда они не могут передавать значения а если их всех поместить в один файл там где функция WinMain, тогда они передают почему так не пойму везде вроде поставил public:
     
  5. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Для: GRAMER
    Вы, конечно, меня извините, но хватит пороть ахинею. Телепатов здесь нет. Хотите помощи - покажите конкретный код. Если Ваш код слишком большой, то сделайте тестовый пример, отражающий суть проблемы. Если Вы не цените свое время, то цените время других, кто отвечает на такие пусты вопросы. А то читая такие заявления как: <!--QuoteBegin-GRAMER+18:07:2007, 12:07 -->
    <span class="vbquote">(GRAMER @ 18:07:2007, 12:07 )</span><!--QuoteEBegin-->в MFC почему то всё нормально работает
    [snapback]72574" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    от человека с такой!!! специализацией начинаешь искать ближайшую стенку со странными мыслями :)
     
  6. GRAMER

    GRAMER Гость

    Я вообще раньше не когда не использовал в WinApi Классы для этого я использовал MFC,
    но так как сейчас требуется на WinApi такая ху.... появилась я решил использовать классы потому что код стал очень большой.
    Код немного подрезал
    В общей сложности код состоит из C++, WinApi, DirectX


    Это файл Dscene.h
    Код (Text):
    #pragma comment(lib, "d3d9.lib")
    #pragma comment(lib, "d3dx9.lib")
    #pragma comment(lib, "winmm.lib")
    #pragma comment (lib, "comctl32.lib")

    #include <windows.h>
    #include <d3d9.h>
    #include <d3dx9.h>


    class Dscene
    {
    public:
    Dscene();

    D3DPRESENT_PARAMETERS d3dpp;
    D3DDISPLAYMODE d3ddm;

    LPDIRECT3D9 d3d;
    LPDIRECT3DDEVICE9 d3dDevice;
    LPDIRECT3DVERTEXBUFFER9 d3dVBuffer;
    LPDIRECT3DTEXTURE9 Texture;
    LPD3DXFONT Font;

    RECT FontPosition;
    RECT FontPosition2;

    void View();
    void DeviceState();
    void updateViewMatrix();
    void getRealTimeUserInput(int w, int h,bool keys[256],bool clip,float Move);
    void invalidateDeviceObjects(RECT rc1);
    void checkp(bool keys[256]);

    int wor;

    HRESULT InitGeometry();
    HRESULT InitD3D();

    char *title;
    char *title2;
    };
    Это файл Dscene.cpp
    Код (Text):
    #include "SFunction.h"
    #include "Dscene.h"
    #include "resource.h"

    SFunction St;

    #define D3DFVF_LINES (D3DFVF_XYZ | D3DFVF_DIFFUSE)

    struct FLOOR
    {
    FLOAT x,y,z;
    DWORD color;
    };



    Dscene::Dscene()
    {
    d3dDevice = NULL;
    d3d = NULL;
    ZeroMemory(&FontPosition,sizeof(FontPosition));
    ZeroMemory(&FontPosition2,sizeof(FontPosition2));
    Texture = NULL;
    d3dVBuffer = NULL;
    Font = NULL;
    wor=0;
    }



    void Dscene::View()
    {

    D3DXMATRIXA16 matProjection;
    D3DXMatrixPerspectiveFovLH(&matProjection, 45.0f, (float)St.Width/(float)St.Height, 0.1f, 500000.0f ); Width и Height вообще не когда не бурут новые значения из класса SFunction

    if(d3dDevice)
    d3dDevice->SetTransform( D3DTS_PROJECTION, &matProjection );
    }

    void Dscene::DeviceState()
    {
    d3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
    d3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);

    d3dDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, NULL );

    d3dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
    d3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    d3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
    }

    HRESULT Dscene::InitGeometry()
    {

    if (FAILED(d3dDevice->CreateVertexBuffer(64*sizeof(FLOOR),0,D3DFVF_LINES,
    D3DPOOL_MANAGED,&d3dVBuffer,NULL)))
    {
    return E_FAIL;
    }

    VOID *verter;
    if(FAILED(d3dVBuffer->Lock(0,sizeof(verter),(void**)&verter,0)))
    return E_FAIL;
    memcpy(verter,Lines,sizeof(Lines));
    d3dVBuffer->Unlock();

    return S_OK;
    }

    void Dscene::checkp(bool keys[256])
    {
    if (keys['P'] && !St.lr) -------->Здесь пришлось загонять через функцию так как он не берёт новое значение переменной keys. Вопрос почему ?
    {

    St.lr = true;
    St.tr = true;
    if(wor==3)
    {
    wor=0;
    }
    if(St.tr)
    {
    wor+=1;
    }
    St.tr = false;

    }

    if (!keys['P'])
    {
    St.lr = false;
    }

    }

    D3DXVECTOR3 g_vEye(-80.0f, 80.0f, -80.0f);
    D3DXVECTOR3 g_vLook(0.1f, -0.06f, 0.10f);
    D3DXVECTOR3 g_vUp(0.0f, 1.0f, 0.0f);
    D3DXVECTOR3 g_vRight(0.0f, 0.0f, 0.0f);

    void Dscene::updateViewMatrix()
    {
    D3DXMATRIX view;
    D3DXMatrixIdentity( &view );

    D3DXVec3Normalize( &g_vLook, &g_vLook );
    D3DXVec3Cross( &g_vRight, &g_vUp, &g_vLook );
    D3DXVec3Normalize( &g_vRight, &g_vRight );
    D3DXVec3Cross( &g_vUp, &g_vLook, &g_vRight );
    D3DXVec3Normalize( &g_vUp, &g_vUp );

    view._11 = g_vRight.x;
    view._12 = g_vUp.x;
    view._13 = g_vLook.x;
    view._14 = 0.0f;

    view._21 = g_vRight.y;
    view._22 = g_vUp.y;
    view._23 = g_vLook.y;
    view._24 = 0.0f;

    view._31 = g_vRight.z;
    view._32 = g_vUp.z;
    view._33 = g_vLook.z;
    view._34 = 0.0f;

    view._41 = -D3DXVec3Dot( &g_vEye, &g_vRight );
    view._42 = -D3DXVec3Dot( &g_vEye, &g_vUp );
    view._43 = -D3DXVec3Dot( &g_vEye, &g_vLook );
    view._44 = 1.0f;

    d3dDevice->SetTransform( D3DTS_VIEW, &view );
    }

    void Dscene::getRealTimeUserInput(int w, int h,bool keys[256],bool clip,float Move)
    {
    POINT mousePosit;
    GetCursorPos( &mousePosit );

    int yDirection = (w - mousePosit.x);       
    int yRotation = (h - mousePosit.y);

    D3DXMATRIX matRotation;

    D3DXMatrixRotationAxis( &matRotation, &g_vRight, D3DXToRadian((float)-yRotation / 3.0f));
    D3DXVec3TransformCoord( &g_vLook, &g_vLook, &matRotation );
    D3DXVec3TransformCoord( &g_vUp, &g_vUp, &matRotation );

    D3DXMatrixRotationAxis( &matRotation, &D3DXVECTOR3(0,1,0), D3DXToRadian((float)-yDirection / 3.0f) );
    D3DXVec3TransformCoord( &g_vLook, &g_vLook, &matRotation );
    D3DXVec3TransformCoord( &g_vUp, &g_vUp, &matRotation );

    if( keys[VK_UP] )
    g_vEye -= g_vLook*-Move;

    if( keys[VK_DOWN])
    g_vEye += (g_vLook*-Move);

    if( keys[VK_LEFT] )
    g_vEye -= (g_vRight*Move);

    if( keys[VK_RIGHT] )
    g_vEye += (g_vRight*Move);

    if( keys[VK_HOME] )
    g_vEye.y += Move;

    if( keys[VK_END] )
    g_vEye.y -= Move;
    if (St.clip)----- Здесь так вообще он не когда не обновляет значение хоть в класс SFunction меняй и не меняй значения.
    {
    SetCursorPos(w, h);
    }
    }


    void Dscene::invalidateDeviceObjects(RECT rc1)
    {
    if(Font!=NULL)
    Font->Release();

    d3dpp.BackBufferWidth = rc1.right - rc1.left;
    d3dpp.BackBufferHeight = rc1.bottom - rc1.top;
    d3dpp.BackBufferFormat = d3ddm.Format;
    d3dpp.BackBufferCount = 1;
    d3dpp.EnableAutoDepthStencil = true;
    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
    d3dpp.Windowed = true;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

    HRESULT hr = d3dDevice->Reset( &d3dpp );
    if( hr == D3DERR_INVALIDCALL )
    {
    MessageBox( NULL, "Невозможно обновить сцену","ERROR", MB_OK | MB_ICONEXCLAMATION );
    }

    View();
    D3DXCreateFont(d3dDevice, 15, 0, 0, 1, 0, DEFAULT_CHARSET,
    OUT_DEFAULT_PRECIS, DEFAULT_QUALITY,
    DEFAULT_PITCH | FF_DONTCARE, "Arial", &Font);

    DeviceState();
    }
    Это файл SFunction.h
    Код (Text):
    #include <windows.h>
    #include <d3d9.h>
    #include <d3dx9.h>
    #pragma once

    class SFunction
    {
    public:
    SFunction();
    HWND hwnd;
    HWND hwndp;

    POINT pn;


    RECT rc1;

    HACCEL CreateAccelerators();

    int Width;
    int Height;
    int w;
    int h;
    int xPos;
    int yPos;

    bool lp,la,le[20];
    bool lr;
    bool tr;
    bool keys[256];
    bool clip;
    bool Fly;
    bool TDest;
    bool Dest;
    bool Floor;

    char FrPS[20];
    char szBuf[20];

    float Move;

    short zDelta;

    int CreateMenuItem(HMENU hmenu, char *str,UINT uID, UINT wID ,HMENU hSubMenu,int ms);

    void FPS();
    void Clean();
    void MWheel(short zDelta);
    void WindowRect();
    void MakeWindow();
    void PressButton();

    };
    Это файл SFunction.cpp
    Код (Text):
    #include "Dscene.h"
    #include "SFunction.h"
    #include "3DSLoad.h"

    DSLoad dsl;
    Dscene Ds;

    SFunction::SFunction()
    {
    Width = 1024;
    Height = 768;
    Move = 0.5f;
    w = 0;
    h = 0;
    clip = false;
    zDelta = NULL;
    ZeroMemory(&keys,sizeof(keys));
    Fly = NULL;
    xPos = 0;
    yPos = 0;
    ZeroMemory(&FrPS,sizeof(FrPS));
    TDest = NULL;
    Dest = NULL;
    Floor = true;
    }

    void SFunction::MWheel(short zDelta)
    {
    if (zDelta > 0)
    {
    Move += Move+Move/3;
    }
    else
    {
    if ( Move<0.00001f )
    {
    Move = 0.0000000001f;
    }
    else
    {
    Move -= Move/3;
    }
    }


    }

    void SFunction::PressButton()
    {
    RECT rc;

    GetWindowRect(hwnd,&rc);
    rc.top = rc.top + 50;
    rc.left = rc.left + 5;
    rc.right = rc.right - 15;
    rc.bottom = rc.bottom - 20;


    Ds.checkp(keys);

    if (keys['F'] && !le[0])
    {
    le[0] = true;
    le[1] = true;
    if(le[1])
    SendMessage(hwnd,WM_COMMAND,2001,0);


    }

    if (!keys['F'])
    {
    le[0] = false;
    }

    if (keys['Q'] && !la)
    {
    la=true;
    le[2]=true;
    if(le[2])
    SendMessage(hwnd,WM_COMMAND,2005,0);

    }

    if (!keys['Q'])
    {
    la=false;
    }

    if (keys[VK_ESCAPE] && !lp)
    {
    lp=true;
    Fly=!Fly;

    if (!Fly)
    {
    clip = false;
    ClipCursor(NULL);
    SetCursorPos(pn.x, pn.y);
    ShowCursor(true);

    }
    else
    {
    GetCursorPos(&pn);
    ShowCursor(true);

    w = xPos + Width / 2;
    h = yPos + Height / 2;


    SetCursorPos(w, h);
    clip = true;
    if (clip)
    {
    ClipCursor(&rc);
    }


    }

    }

    if (!keys[VK_ESCAPE])
    {
    lp=false;
    }

    }


    void SFunction::Clean()
    {
    if (Ds.d3dDevice!=NULL)
    {

    Ds.d3dDevice->Release(); ------------------> Вот здесь не происходит очистка потому что он думает что он пустой хотя нет, он взял первые значения каторые были при создании этого класса и стех пор больше ни когда не обновляет, почему так и так везде.
    }


    if (Ds.d3d!=NULL)
    Ds.d3d->Release(); ------> Здесь

    if (Ds.d3dVBuffer!=NULL)
    Ds.d3dVBuffer->Release(); ------> Здесь

    if (Ds.Texture!=NULL)
    Ds.Texture->Release(); ------> Здесь

    if (dsl.d3dVBuffer != NULL) ------> Здесь
    {
    MessageBox(NULL,"OK","OK",MB_OK);
    dsl.d3dVBuffer->Release();
    }

    if (dsl.d3dIBuffer!=NULL)
    dsl.d3dIBuffer->Release(); ------> Здесь

    if (Ds.Font!=NULL) ------> Здесь

    Ds.Font->Release(); ------> Здесь

    Ds.title = 0;
    Ds.title2 = 0;
    DestroyWindow(hwndp);
    }

    void SFunction::FPS()
    {
    static float FPS = 0.0f;
    float nextSecond = 0.0f;
    static float prevSecond = 0.0f;

    FPS++;

    nextSecond = GetTickCount() * 0.001f;              

    if(nextSecond - prevSecond > 1.0f)
    {
    prevSecond = nextSecond;
    wsprintf(FrPS, "FPS: %d", int(FPS));
    FPS = 0;
    }
    }


    void SFunction::WindowRect()
    {
    GetWindowRect(hwnd,&rc1);
    if (TDest)
    {
    rc1.top = 0;
    }
    else
    {
    rc1.top = 31;      
    }
    rc1.left = 160;
    rc1.right = Width;
    if (!Dest)
    {
    rc1.bottom = Height-20;
    }
    else
    {
    rc1.bottom = Height;
    }
    }
    Вот почему он значения не обновляет ?
     
  7. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Да уж... Чужое время Вы точно не цените...
     
  8. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Лень детально разбираться в 10Кб кода, но с первого взгляда видно, что в разных классах идет работа с разными объектами
     
  9. Pasha

    Pasha Гость

    Для: GRAMER
    Я, конечно, гуру только в C#, но блин для "получения новых значений из класса" нужно сначала эти значения присвоить полям объекта. Где строчки вида "Width =", "Height =", "d3dDevice = new ..."?
    И вообще, может это покажется странным, но в C++ классы из кода создавать нельзя. Можно создавать объекты классов. И блин передавать bool keys[256] и спрашивать "а чего оно не поменялось" ... почитайте про передачу параметров в функию по значению, по ссылке, про указатели, про ... почитайте любую книгу по C.
     
  10. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--QuoteBegin-Pasha+18:07:2007, 15:14 -->
    <span class="vbquote">(Pasha @ 18:07:2007, 15:14 )</span><!--QuoteEBegin-->в C++ классы из кода создавать нельзя.
    [snapback]72602" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Что-то я не понял что имелось в виду

    <!--QuoteBegin-Pasha+18:07:2007, 15:14 -->
    <span class="vbquote">(Pasha @ 18:07:2007, 15:14 )</span><!--QuoteEBegin-->Где строчки вида "Width =", "Height =", "d3dDevice = new ..."?
    [snapback]72602" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Это секретный код, типа собственность автора :)<!--QuoteBegin-Pasha+18:07:2007, 15:14 -->
    <span class="vbquote">(Pasha @ 18:07:2007, 15:14 )</span><!--QuoteEBegin-->почитайте любую книгу по C.
    [snapback]72602" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Вот это точно
     
  11. Pasha

    Pasha Гость

    <!--QuoteBegin-European+18:07:2007, 15:40 -->
    <span class="vbquote">(European @ 18:07:2007, 15:40 )</span><!--QuoteEBegin-->Что-то я не понял что имелось в виду
    [snapback]72606" rel="nofollow" target="_blank[/snapback]​
    [/quote]Имелось в виду, что экзепляры классов и классы - это разные вещи.
     
  12. GRAMER

    GRAMER Гость

    Width , Height Это я передою размеры окна что бы вид взляда был точным.

    Уже много читал, только чего такого не находил. Ладно всё равно спасибо !
     
  13. Pasha

    Pasha Гость

    Для: GRAMER
    Передаешь? Где?
     
Загрузка...
Похожие Темы - Классы
  1. 203
    Ответов:
    11
    Просмотров:
    2.579
  2. vladis222
    Ответов:
    4
    Просмотров:
    1.650
  3. BashOrgRu
    Ответов:
    6
    Просмотров:
    4.147
  4. VladSh
    Ответов:
    22
    Просмотров:
    7.204
  5. Azgor
    Ответов:
    2
    Просмотров:
    1.676
Статус темы:
Закрыта.

Поделиться этой страницей