Zagnieżdżona struktura- definicja.

Odpowiedz Nowy wątek
2016-02-26 20:38
0

Cześć ;)
Czy dobrze myślę, że jeżeli mamy:

//Klasa.h
class Klasa{
public:
 struct Nested;

};

To taka struktura powinna być od razu zdefiniowana w klasie Klasa, a nie np. w pliku implementacji. ( Klasa.cpp), prawda? Jest tak dlatego, że jeżeli jakaś jednostka translacji chciałaby zrobić tak:

#include "Klasa.h"
std::unique_ptr<Klasa::Nested> d;

to się pojawia problem bo na etapie kompilacji nie znamy rozmiaru Nested ( no więc nie znamy chociażby jak przesuwać wskaźnis stosu- to tylko taki jeden blahy powód).

Czy dobrze rozumuję?

edytowany 2x, ostatnio: mielony, 2016-02-26 20:39

Pozostało 580 znaków

2016-02-26 20:53
1

Powinno to wyglądać tak samo, jak w przypadku zwykłej klasy:
// HPP

struct foo {
        struct foo_nasted {
                void some_func ();

                void some_other_func (int);
        };

        void some_func ();
};

// CPP

void foo::some_func () { }

void foo::foo_nasted::some_func () { }

void foo::foo_nasted::some_other_func (int) { }

Strasznie przekombinowałeś, kompilator nie ma z tym problemu dlatego, że rozmiar klasy nie zależy od definicji jej funkcji składowych.
http://melpon.org/wandbox/permlink/bSQOZ9EOBh1Prm9o


edytowany 2x, ostatnio: pingwindyktator, 2016-02-26 20:56

Pozostało 580 znaków

2016-02-26 20:55
0

Z definicja funkcji to wiem. Chodzi mi o składowe ( dane)

Pozostało 580 znaków

2016-02-26 20:57
0

To samo. Deklaracje w hpp, definicje w cpp. I to samo wytłumaczenie. W jaki sposób rozmiar klasy zależy od definicji jej składowych?


edytowany 1x, ostatnio: pingwindyktator, 2016-02-26 20:58

Pozostało 580 znaków

2016-02-26 21:06
0

No to wtedy jest błąd kompilacji jeżeli w innej jednostce translacji się tak:
Klasa::Nested n;
error:
error: invalid use of incomplete type 'struct Klasa::Nested'

Pozostało 580 znaków

2016-02-26 21:10
1

http://melpon.org/wandbox/permlink/ldfYvVYOxzZO1NXa
gdzie niby. Schrzaniłeś coś w innym miejscu. Pokaż kod.


edytowany 1x, ostatnio: pingwindyktator, 2016-02-26 21:11

Pozostało 580 znaków

2016-02-26 21:13
0

Dzięki, pokazując kod potwierdziłeś moje tezy.
Po prostu nie zrozumiałeś, o co mi chodzi bądź ja też źle wyjaśniałem. Ale teraz już wszystko jasne- dzięki :)

taka struktura powinna być od razu zdefiniowana w klasie Klasa to jest kłamstwo. Ale już wiesz. - pingwindyktator 2016-02-26 21:17

Pozostało 580 znaków

2016-02-27 11:57
kq

Nie musisz definiować klasy w miejscu jej deklaracji. Ale w miejscu gdzie pełna definicja jest niezbędna (np. konkretyzacja destruktora unique_ptr¹) musisz widzieć tę definicję.

http://melpon.org/wandbox/permlink/9Ig0OLIfniHyejs0

¹ można stworzyć takiego potworka:

struct Foo
{
    struct Bar;
};

int main()
{
    auto ptr = new unique_ptr<Foo::Bar>();
    // delete ptr; // error (incomplete type)
}

Warto zobaczyć: http://jonjagger.blogspot.com/2013/04/the-include-test.html


edytowany 1x, ostatnio: kq, 2016-02-27 11:58

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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