Ładniejszy sposób na implementację drzewa węzłów

0

Witam. Potrzebuję prostego sposobu na implementację drzewa węzłów w kodzie programu, aby działało tak:

Node root
|- SpatialNode object
|  |- MeshNode mesh
|- SpatialNode object2
|  |- MeshNode mesh
|- SpatialNode object3
|  |- MeshNode mesh

Napisałem już prosty kod, ale poszukuję ładnie ułożonego sposobu, który zadziała w każdej sytuacji, a nie jestem pewien, co do moich rozwiązań.

KOD:

#include <iostream>

struct Spatial
{
    float x, y, z;
};
struct Mesh : Spatial
{
    float vertices[];
};

enum NODE_TYPE{NODE, SPATIAL, MESH};
union NODE_DATA{Spatial spatial; Mesh mesh;};
struct Node
{
    NODE_TYPE type;
    NODE_DATA data;
    Node* parent;

    Node(NODE_TYPE t, Node* p) : type{t}, parent{p}{}
    NODE_DATA* get_parent_data(void){return &(parent->data);}
    NODE_DATA* get_node_data(void){return &data;}
    bool is_root(void){return parent == NULL;}
};

int main()
{
    Node p(SPATIAL, NULL);
    Node n(NODE, &p);
    if(p.type == SPATIAL)
    {
        p.get_node_data()->spatial.x = 1.5;
        std::cout<<n.get_parent_data()->spatial.x;
    }
    return 0;
}
0

Jeśli to C++, to nie używaj surowych tablic i wskaźników, tylko vector oraz shared_ptr (chyba, że masz realną potrzebę) -- będzie ładniej i mniej awaryjnie. Zresztą union też nie wróży niczego dobrego...

No i co to jest float vertices[] i jak chcesz tego użyć?

0

Zgoda ale raczej polecałbym unique_ptr gdzie tylko to możliwe.

0
ketam napisał(a):

Zgoda ale raczej polecałbym unique_ptr gdzie tylko to możliwe.

Oczywiście, że tak -- podałem shared_ptr, bo zawsze będzie działać, ale jeśli się da, to należy rzeczywiście zmienić na unique_ptr. Tylko, że tu podejrzewam, że się chyba nie da. :)

1

W zależności jednak od podejścia sam shared_ptr może być przy pisaniu takich hierarchicznych struktur potencjalnie niewystarczający/niebezpieczny. Przy relacji parent - child gdy oba te obiekty posiadają wskaźniki na siebie, powstaje cykliczna zależność, która naturalnie spowoduje, że licznik referencji nie dobije nigdy do 0 i pamięć nie pozostanie zwolniona.

0

Te klasy Spatial i Mesh są tylko dla pokazania jak miałby ten system działać. Mają przykładowe zawartości i są nieużyteczne.

Chcę wiedzieć, czy moje podejście do tego drzewa jest prawidłowe, czy może powinienem stworzyć jakąś klase typu NodeTree, albo użyć jeszcze innego sposobu.

0
ketam napisał(a):

W zależności jednak od podejścia sam shared_ptr może być przy pisaniu takich hierarchicznych struktur potencjalnie niewystarczający/niebezpieczny. Przy relacji parent - child gdy oba te obiekty posiadają wskaźniki na siebie, powstaje cykliczna zależność, która naturalnie spowoduje, że licznik referencji nie dobije nigdy do 0 i pamięć nie pozostanie zwolniona.

Tak, ale w takiej konstrukcji należy używać weak_ptr dla wskazywania na ojca...

0

Problem polega na tym, że prosisz o poprawienie kodu, którego wymagania nie są nam znane.
Odgadniecie wymagań na podstawie takiego kodu (uproszczonego i krótkiego) zwykle prowadzi do nieporozumień.
W tej sytuacji dyskusja nad rodzajem wskaźników jakich należy użyć jest sprawą drugorzędną.

1 użytkowników online, w tym zalogowanych: 0, gości: 1