• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C++] Czy jest jakiś sposób na wypisanie wszystkich zmiennych danej struktury/klasy nie znając ich nazw?

0 głosów
110 wizyt
pytanie zadane 29 marca 2018 w C i C++ przez Hiskiel Pasjonat (22,990 p.)
edycja 29 marca 2018 przez Hiskiel

Witam!

 

Chodzi mi o to co jest opisie. Mam sobie np. strukturę WIN32_FIND_DATA i teraz zamiast po kolei wypisywać każdy jej element, chciałbym, żeby wszystko było wypisywane automatycznie. Da się tak?

 

Posłużę się np. tym przykładem:

#include <iostream>
#include <windows.h>
#include <fstream>

using namespace std;

int main(){
    WIN32_FIND_DATA F;

    if(FindFirstFile("file.txt", &F)){
        cout<<"File found!"<<endl;
    }else{
        cout<<"Cannot find file."<<endl;
    }

    cout<<F.cAlternateFileName<<endl;
    cout<<F.cFileName<<endl;
    cout<<F.dwFileAttributes<<endl;
    cout<<F.dwReserved0<<endl;
    cout<<F.dwReserved1<<endl;
    cout<<F.ftCreationTime.dwHighDateTime<<endl;
    cout<<F.ftCreationTime.dwLowDateTime<<endl;
    cout<<F.ftLastAccessTime.dwHighDateTime<<endl;
    cout<<F.ftLastAccessTime.dwLowDateTime<<endl;
    cout<<F.ftLastWriteTime.dwHighDateTime<<endl;
    cout<<F.ftLastWriteTime.dwLowDateTime<<endl;
    cout<<F.nFileSizeHigh<<endl;
    cout<<F.nFileSizeLow<<endl;
}

 

Zamiast wypisywać 1000 razy COŚ, to chciałbym zrobić np. jakąś pętlę w której byłyby wypisywane obiekty i "podzmienne".

 

Lub inaczej. Czy jest jakiś sposób, na poznanie liczby zmiennych w danej strukturze i ich potem jakoś ich nazw?

 

Pozdrawiam, Hiskiel.

3 odpowiedzi

+1 głos
odpowiedź 29 marca 2018 przez nik Obywatel (1,630 p.)
Zawsze możesz walnąć jakiegoś toString();
komentarz 29 marca 2018 przez Hiskiel Pasjonat (22,990 p.)
Nic mi o tym nie wiadomo i nie mogę nic o tym znaleźć. Rozwiniesz myśl?
komentarz 29 marca 2018 przez nik Obywatel (1,630 p.)

Jasne, chodzi o to, że w klasie robisz metodę która zwraca przekonwertowane na string elementy klasy. Takie coś :

class A{
	int a;
	string z;

	// kod

	string toString(){ return to_string(a) + " " + z;}	
}

class B{
	int b;
	A c;
	string g;

	// kod

	string toString(){ return to_string(b) + c.toString() + g;}
}

 

0 głosów
odpowiedź 29 marca 2018 przez Bondrusiek Maniak (51,380 p.)
Witam,

można w tym wypadku wykorzystać wzorzec metaobiekt. Taki wzorzec wykorzystuje Qt i na tej podstawie działają tam sygnały i sloty.

https://en.wikipedia.org/wiki/Metaobject
0 głosów
odpowiedź 29 marca 2018 przez mokrowski VIP (111,080 p.)

Odpowiadając krótko na obecny stan standardu języka C++: Nie.

Jeśli jednak zagłębić się w temat, oczywiście istnieje taka możliwość. Problemy które należy przezwyciężyć to uzyskanie informacji o:

1. Przesunięciu danego pola od początku obiektu czy struktury.

2. Jego typie (a więc i wielkości)

3. Jego nazwie zrozumiałej dla człowieka.

Jeśli chcesz te informacje wyłuskać, to masz możliwe drogi:

1. RTTI (Run Time Type Information) https://en.wikipedia.org/wiki/Run-time_type_information

2. Techniki dodatkowych makr budujących te informacje (co robi implementacja metaobiektów dla Qt)

3. Mechanizmy rozszerzeń dla danego kompilatora (np. kernel GNU/Linux intensywnie wykorzystuje rozszerzenia dla gcc by takie cele osiągać dla nawet zwykłego C)

4. Mechanizmy szablonowe które implementują refleksyjność.

5. Czekanie na mechanizmy refleksyjności które są obecnie na etapie propozycji w standardzie.

Każda z tych metod przy omówieniu nie mieści się w zakresie odpowiedzi na forum i ma swoje ograniczenia, dobre i słabe strony, zakres zastosowań dla danego kompilatora.

 

Podobne pytania

0 głosów
1 odpowiedź 61 wizyt
pytanie zadane 13 czerwca 2018 w C i C++ przez Sic Mądrala (7,370 p.)
0 głosów
2 odpowiedzi 98 wizyt
pytanie zadane 27 maja 2018 w C i C++ przez Stu Nowicjusz (190 p.)
0 głosów
1 odpowiedź 119 wizyt
pytanie zadane 23 maja 2016 w C# i .NET przez niezalogowany
Porady nie od parady
Odznacz odpowiedź zieloną fajką, jeśli uważasz, że jest ona najlepsza ze wszystkich i umożliwiła ci rozwiązanie problemu.Najlepsza odpowiedź

65,755 zapytań

112,393 odpowiedzi

237,319 komentarzy

46,700 pasjonatów

Przeglądających: 120
Pasjonatów: 0 Gości: 120

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...