Zagnieżdżona struktura- definicja.

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ę?

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

0

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

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?

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'

1

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

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 :)

3

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

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