Zagnieżdżona struktura- definicja.

Zagnieżdżona struktura- definicja.
MI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 199
0

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

Kopiuj
//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:

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

pingwindyktator
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 1055
1

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

Kopiuj
struct foo {
		struct foo_nasted {
				void some_func ();

				void some_other_func (int);
		};

		void some_func ();
};

// CPP

Kopiuj
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

MI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 199
0

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

pingwindyktator
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 1055
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?

MI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 199
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'

pingwindyktator
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 1055
1

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

MI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 199
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 :)

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
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:

Kopiuj
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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.