Jak wydobyć nazwę typu (klasy)?

0

Witam! Piszać takie byle co, chciałem zrobić, aby w konstruktorze wyświetlało mi "Utworzono obiekt typu <typ> o nazwie <nazwa>, adres: <adres>". Nie wiem jak zrobić typ. Czyli na przykład zrobiłem sobie typ TObject i mam "... typu TObject". Proszę o pomoc, ale nie wiem czy w ogóle takie coś się da.

0

Chyba wiesz, jak się nazywa klasa, której kod piszesz?

0

Poczytaj o mechanizmach refleksji - ona służy do uzyskiwania informacji o klasach obiektów.

0

Refleksja w C++? Od kiedy?

0

RTTI takich bajerów nie udostępnia? Albo zrobić jakieś wirtualne metody toString()?

0

RTTI najwyżej odpowie "czy obiekt X jest klasy Y", refleksji takiej jak javowa nie ma. A jak ktos miałby pisać takiego toString() to juz może równie dobrze sobie to ręcznie wpisać do konstruktorów ;]

0

Wiecie co? Nawet nie wiem po co mi takie coś. Przecież i tak tworzę obiekt danej klasy, która ma jedną nazwę. Ale jak pisałem program to myślałem o takim czymś co by było do wszystkich tworzonych zmiennych w programie :D Takie coś by dało radę zrobić? Niech będzie nawet z konstruktorów tylko informacja, też chcę typów domyślnych. Przykład:
Klasa A i tu już bym miał to co chcę z konstruktora i destruktora. Ale jak zrobić z np int? Żeby było, że utworzona została zmienna typu int?

0

Nie wiem czy to jest dobry pomysł, ale byś mógł napisać funkcję "nazwa", i ją przeładować dla każdego typu zmiennej np.:

 void nazwa(int a)
{
    cout << " jest obiektem typu int" << endl; 
}

void nazwa(double a)
{
    cout  << " jest obiektem typu double" << endl; 
}
...
0

Adres obiektu w C++ jest zawsze, jego nazwę (jeżeli dobrze rozumiem że chodzi ci o nazwę zmiennej) w C++ nie dostaniesz nigdy nawet w jakimś tysięcznym standardzie bo to przeczy naturze tego języka, natomiast jego typ możesz wydobyć za pomocą typeid() po dołączeniu <typeinfo>.
W przypadku kiedy masz przypisany do wskaźnika do klasy bazowej obiekt klasy pochodnej i chcesz wydobyć typ tej klasy pochodnej to jest wymagane aby klasa bazowa miała przynajmniej jedną metodę wirtualną. Właściwie ten wymóg spełnia się automagicznie, ponieważ w jeżeli masz wskaźnik do klasy bazowej pod który podpinasz obiekt klasy pochodnej to musisz zrobić wirtualny destruktor inaczej ryzykujesz wyciekami pamięci.

0

może w ten sposób?

#include <iostream>
#include <string>
#include <typeinfo>
#include <cxxabi.h>

using namespace std;

template<class T>
    inline string realName(const T &obj) {
        return string(abi::__cxa_demangle(typeid(obj).name(), 0, 0, 0));
    }

class Base {
    public:
        Base(){}
        virtual ~Base(){}
        virtual void foo() = 0;
};

class Example : public Base {
    public:
        void foo(){}
};

class Another {
    public:
        Another(){}
        ~Another(){}
};

int main()
{
    Base *pBase = new Example();
    Example *pExample = new Example();
    Another *pAnother = new Another();

    cout << realName(pBase) << endl
         << realName(*pBase) << endl
         << realName(pExample) << endl
         << realName(*pExample) << endl
         << realName(pAnother) << endl
         << realName(*pAnother);
    return 0;
}

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