Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

wskaznik do elementu klasy wewnątrz klasy

Ostatnio zmodyfikowano 2015-07-03 17:33
Autor Wiadomość
darko202
» 2015-07-03 12:33:37
niezależnie od używania biblioteki i konkretnych funkcji wydaje mi się, że zapominasz o polimorfizmie klas
opis np. w
http://cpp0x.pl/kursy​/Programowanie-obiektowe-C++​/Polimorfizm/Metody-wirtualne​/495

polimorfizm właśnie pozwala przechowywać obiekty różnych klas w jednym kontenerze
i po wywołaniu tej samej metody  (z nazwy) wykonują się operacje z właściwej klasy

Powodzenia :)
    
P-134272
notabigthreat
» 2015-07-03 13:26:55
polimorfizm właśnie pozwala przechowywać obiekty różnych klas w jednym kontenerze
Nie w std::vector.
P-134273
RazzorFlame
» 2015-07-03 13:44:33
@Up, skąd te założenie?

Prawda jest taka, że ani darko202 i notabigthreat nie mają pełnej racji.
C/C++
class Base
{
public:
    Base( int xx )
    {
        x = xx;
    }
    int x;
};
class Derived
    : public Base
{
public:
    Derived( int xx, yy )
        : Base( xx )
    {
        y = yy;
    }
    int y;
};

std::vector < Base > VecBase;
VecBase.push_back( Derived( 0, 1 ) ); // W tym momencie obiekt Derived jest obcinany do klasy Base
std::vector < Base *> VecBasePtr;
VecBasePtr.push_back( new Derived( 1, 2 ) ); // W vectorze pozostaje tylko wskaźnik, który można potem rzutować na obiekt klasy Derived

------------------------------------------------------

Teraz odnośnie ostatniego postu założyciela tematu.
Przedstawię Ci taką podstawową hierarchię:
C/C++
class Object
{
public:
    bool CanPlaceInWorld;
    std::wstring ObjectIdentifier;
   
    Object( std::wstring ArgObjectIdentifier )
        : ObjectIdentifier( ArgObjectIdentifier )
    {
        CanPlaceInWorld = false; // Nie mozna zwyklego obiektu dodac do swiata gry, istnieje tylko abstrakcyjnie
    }
   
};
class Asset
    : public Object
{
    typedef Object Super; /* Za "Super" uznaje sie klase nadrzedna */
public:
    Asset( std::wstring ArgObjectIdentifier )
        : Super( ArgObjectIdentifier )
    {
        CanPlaceInWorld = false;
    }
   
    virtual void DrawWithTransform( Transform transform )
    {
    }
};
class Mesh
    : public Asset
{
    typedef Asset Super;
public:
    Mesh( std::wstring ArgObjectIdentifier )
        : Super( ArgObjectIdentifier )
    {
        CanPlaceInWorld = false;
    }
    virtual void DrawWithTransform( Transform transform ) override
    {
        // Ta funkcja powinna byc inna dla kazdego typu "Assetu" czyli np. Skeletal Mesh, Static Mesh, Particle Effect
       
        // Wyswietl verteksy
    }
};

class SceneActor; // Deklaracja

class BaseComponent
    : public Object
{
    typedef Object Super;
protected:
    Asset * UsedAsset;
    Transform AssetTransform; // Relatywny do wlasciciela
    SceneActor * Parent;
public:
    BaseComponent( std::wstring ArgObjectIdentifier )
        : Super( ArgObjectIdentifier )
    {
        CanPlaceInWorld = false;
    }
   
    virtual void OnDraw()
    {
        if( Parent )
        {
            Transform WorldTransform = AssetTransform + Parent->ActorTransform;
            UsedAsset->DrawWithTransform( WorldTransform );
        }
    }
};
class MeshComponent
    : public BaseComponent
{
    typedef BaseComponent Super;
public:
    MeshComponent( std::wstring ArgObjectIdentifier, SceneActor * ArgParent, Mesh * ArgUsedAssetMesh )
        : Super( ArgObjectIdentifier )
         , Parent( ArgParent )
         , UsedAsset( ArgUsedAsset )
    {
        CanPlaceInWorld = false;
    }
};
class SceneActor
    : public Object
{
    typedef Object Super;
protected:
    std::vector < BaseComponent *> Components;
    Transform ActorTransform;
    void AddNewComponent( BaseComponent * ArgNewComponent )
    {
        Components.push_back( ArgNewComponent );
    }
public:
    SceneActor( std::wstring ArgObjectIdentifier )
        : Super( ArgObjectIdentifier )
    {
        CanPlaceInWorld = true; // Dopiero ten obiekt mozesz dodac do swiata;
    }
   
    void OnDraw()
    {
        for( int i = 0; i < Components.size(); i++ )
             Components[ i ]->OnDraw();
       
    }
};

class Player
    : public SceneActor
{
    typedef SceneActor Super;
protected:
public:
    Player( std::wstring ArgObjectIdentifier )
        : Super( ArgObjectIdentifier )
    {
        CanPlaceInWorld = true; // Ten obiekt mozesz dodac do swiata;
       
        Mesh * MeshAsset = /* Globalna funkcja */ Engine::FindAsset( std::wstring( L"Mesh.obj" ) );
        MeshComponent * DefaultMesh = new MeshComponent( std::wstring( L"DefaultMesh" ), this, MeshAsset );
        AddNewComponent( DefaultMesh );
    }
}

class Engine
{
    static std::vector < Object *> Objects;
public:
    static Asset FindAsset( std::wstring ArgObjectIdentifier )
    {
        // tutaj iterujesz po kazdym elemencie vectora "Objects"
    }
};
Ale się rozpisałem... Powinienem jakiś artykuł napisać. Jak czegoś nie zrozumiałeś to pytaj ;]
P-134274
qrchack
Temat założony przez niniejszego użytkownika
» 2015-07-03 17:33:30
@darko202 @notabigthreat
Absolutnie nie zapomniałem o polimorfizmie :]

I dlatego mam klase cObiekt, z której będzie się dopiero wywodzil cGracz, cWrog, cSolids, cDestructible itd.

Ale nie widzę sensu pchania ich butem do jednego wektora, bo jak ja zrobie test kolizji? jak będę mieć wszystko w jednym wektorze, to skąd będę wiedział co jest wrogiem, a co beczką? Wiadomo z góry, że beczka po wieki wieków będzie stała gdzie stoi i nigdy nie przytuli się do ściany (na moim etapie nie mam ambicji tworzenia "ruchomego" środowiska) Dlatego wlasnie mam osobne wektory (będę miał). Będę robił test kolizji między wektorami cWrogowie i cSolids, ale już między cSolids a cDestructible nie.

to że std::vector wypełniony wskaźnikami działa to już wiem :] Pisałem kiedyś z kumplem asteroidsy... i tam właśnie miałem główną klasę cAsteroida z której wywodziły się cAstWybuchowa, cToxic itd. I one wszystkie były w jednym wektorze. w sumie mogę tu wrzucić - projektu nie dokończyliśmy i chyba już nie dokończymy :]

Tak swoją drogą - jak się pochwalić gotowym exekiem? (w sensie, gdzie polecacie wrzucić, żeby podlinkować)

I jeszcze jedno - temat trzeba by chyba podzielić - bo na pytanie o wskaźnik odpowiedź już uzyskałem, a zaczynamy dryfować w bliżej nieokreślonym kierunku (co zresztą całkiem przyjemne jest ;] )
P-134281
1 « 2 »
Poprzednia strona Strona 2 z 2