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.
Chyba wiesz, jak się nazywa klasa, której kod piszesz?
Poczytaj o mechanizmach refleksji - ona służy do uzyskiwania informacji o klasach obiektów.
Refleksja w C++? Od kiedy?
RTTI takich bajerów nie udostępnia? Albo zrobić jakieś wirtualne metody toString()?
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 ;]
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
?
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;
}
...
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.
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;
}