Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.79/33: Рейтинг темы: голосов - 33, средняя оценка - 4.79
bobromet
24 / 24 / 3
Регистрация: 06.03.2010
Сообщений: 59
#1

Вывести на экран имя класса

29.08.2010, 16:48. Просмотров 6004. Ответов 19
Метки нет (Все метки)

Можно как нибуть форматнуть в string имя класса?

C++
1
2
3
4
5
6
7
8
class HelloWorld
{   
public:
    string s;
void view(){
        cout << s << endl;
 
};

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.08.2010, 16:48
Ответы с готовыми решениями:

Вывести на экран имя и фамилию 10 раз
здравствуйте, дорогие программисты!помогите пожалуйста решить задачу...вот...

Вывести на экран из класса
Вдвнный момент изучаю классы.Не могу понять как их заполнять и выводить...Вот...

Вывести на экран фамилию, имя и адрес учеников, у которых нет домашнего телефона
Известны данные о 25-ти учениках класса: фамилия, имя, отчество, адрес и...

Вывести на экран элементы очереди пользовательского класса
#include &quot;SportAchievent.h&quot; #include &quot;Competitor.h&quot; #include &lt;queue&gt; using...

Как, создав переменную класса string, вывести ее последнюю букву на экран
Если нужно обратиться к определенному символу слова, то можно использовать это:...

19
HIMen
4253 / 1420 / 101
Регистрация: 12.04.2009
Сообщений: 2,346
29.08.2010, 16:49 #2
Лучший ответ Сообщение было отмечено как решение

Решение

C++
1
2
3
4
5
6
7
8
class HelloWorld
{       
public:
        string s;
void view(){
        cout << "HelloWorld" << endl;
 
};
3
bobromet
24 / 24 / 3
Регистрация: 06.03.2010
Сообщений: 59
29.08.2010, 17:00  [ТС] #3
HIMen, прикольно. Допустим имя класса неизвестно.
0
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
29.08.2010, 17:01 #4
bobromet, А зачем это может понадобиться? Есть такая вещь как typeid(Ob).name(); Но выведет не все имя, а сокращенный тип для этого класса.
Для использования надо подключить: #include <typeinfo>
Ob - объект класса.
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
29.08.2010, 17:06 #5
Лучший ответ Сообщение было отмечено как решение

Решение

bobromet,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <typeinfo>
#include <string>
 
template<class T>
class Named {
public:
  std::string getName() {
    return typeid(T).name();
  }
};
 
class Foo : public Named<Foo> { };
 
int main() {
  std::cout << Foo().getName() << std::endl;
  return 0;
}
3
nikkka
Мат в 32 хода
236 / 171 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
29.08.2010, 17:07 #6
Допустим имя класса неизвестно.
пишешь программу и не знаешь имье класса?

Добавлено через 59 секунд
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
#include <typeinfo>
а вот про это не знал...
0
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
29.08.2010, 17:14 #7
nikkka, Почитай про RTTI. Определение типа во время выполнения(Информация о типе на этапе выполнения).

CyBOSSeR, а есть разница в наличии метода для класса? Или это идентично вашему коду?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <typeinfo>
#include <string>
 
template<class T>
class Named { };
 
class Base : public Named<Base> { };
 
int main() {
  Base b;
  std::cout << typeid(b).name() << std::endl;
  return 0;
}
Или даже так:

C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <typeinfo>
#include <string>
 
class Base { };
 
int main() {
  Base b;
  std::cout << typeid(b).name() << std::endl;
  return 0;
}
1
HIMen
4253 / 1420 / 101
Регистрация: 12.04.2009
Сообщений: 2,346
29.08.2010, 17:18 #8
Цитата Сообщение от bobromet Посмотреть сообщение
HIMen, прикольно. Допустим имя класса неизвестно.
Не понимаю, зачем это нужно. Или с++ позволяет подгружать код во время выполнения?
0
fasked
Эксперт С++
4978 / 2557 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
29.08.2010, 17:27 #9
CyBOSSeR,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <typeinfo>
#include <string>
 
class Class
{
public:
   std::string getName() {
      return typeid(*this).name();
   }
};
 
int main() {
  std::cout << Class().getName() << std::endl;
  return 0;
}
2
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
29.08.2010, 17:29 #10
fasked,
Поиграем кто короче?)
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <typeinfo>
 
class Base { };
 
int main() {
  std::cout << typeid(Base).name() << std::endl;
  return 0;
}
1
bobromet
24 / 24 / 3
Регистрация: 06.03.2010
Сообщений: 59
29.08.2010, 17:36  [ТС] #11
Парни, отлично! Жму 5
Помню что в шарпе так делал, иногда когда куча классов с "говорящими" именами проще вывести имя класса чем каждый раз новую строчку писать .)
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
29.08.2010, 17:46 #12
fasked, попробуй пронаследоватся от Class и вызови метод getName.
Хотя если метод сделать виртуальным все будет ок.

Но если метод мы сделаем виртуальным, у подклассов появится возможность его переопределить, это не есть хорошо, тем более, что реализация данного методв должна быть одинакова во всех подклассах. Кроме того, делая метод виртуальным, мы получаем еще и указатель на таблицу виртуальных функций в каждом объекте.
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
29.08.2010, 18:49 #13
bobromet, можно сделать кривой "костыль" с помощью препроцессора:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <cstdlib>
 
#define methodName(className, method) className ## method
 
#define defClass(className) \
class className \
{ \
public: \
    static void methodName(className, _getName)() \
    { \
        std::cout << #className << std::endl; \
    } \
private :
 
#define endClass };
 
defClass(foo)
endClass
 
defClass(bar)
endClass
 
defClass(fooBar)
endClass
 
int main()
{
    foo::foo_getName();
    bar::bar_getName();
    fooBar::fooBar_getName();
    return EXIT_SUCCESS;
}
C помощью макросов генерируется строка (имя класса) и имя метода, который будет возвращать эту строку. Только вот я даже и не знаю, кому такое чудо может понадобиться...
1
M128K145
Эксперт JavaЭксперт С++
8322 / 3542 / 419
Регистрация: 03.07.2009
Сообщений: 10,708
29.08.2010, 19:07 #14
На сколько я понял, то требуется аналог рефлексии из Java
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
29.08.2010, 19:08 #15
Цитата Сообщение от M128K145 Посмотреть сообщение
На сколько я понял, то требуется аналог рефлексии из Java
Не знаком с Java. Если не трудно, можно объяснить, что это такое?
0
M128K145
Эксперт JavaЭксперт С++
8322 / 3542 / 419
Регистрация: 03.07.2009
Сообщений: 10,708
29.08.2010, 19:26 #16
Nameless One, рефлексия позволяет получить всю информацию о классе, зная только его имя, можно изменять этот класс, копировать его, сериализовать.
http://ru.wikipedia.org/wiki/%D0%9E%...D%D0%B8%D0%B5)
2
System16v
3 / 3 / 1
Регистрация: 19.02.2014
Сообщений: 115
02.06.2015, 11:52 #17
Ребят ну подскажите,как же все таки можно вывести имя объекта класса? Суть в том,что написал лабораторную, в самой лабе есть задание,чтоб на экран выводилось сообщение конструктора и деструктора,и показывало к кому объекту они применяются. Так то я конечно написал, все выводится,но вместо имени я так понимаю что выводится просто адрес объекта,а не его имя.Использовал просто указатель this при выводе. Попытался сделать как выше тут описано через библиотеку typeinfo,все равно не то,выводится не имя объекта,а имя класса . Так то преподаватель думаю ничего не скажет (ибо в самом задании написано,использовать указатель this), просто самому интересно,возможно ли все же как-то сделать,чтоб выводилось именно имя созданного объекта,а не его адрес,как работает через указатель this?
0
mymedia
193 / 193 / 120
Регистрация: 27.05.2011
Сообщений: 544
02.06.2015, 12:02 #18
System16v, в С++ нету стандартных средств, которые позволяли бы вывести имя объекта или класса. Дело в том, что имена типов и объектов известны только компилятору. Когда программа уже выполняется, эту информацию получить сложно (не обращаясь к исходникам). Всё-таки С++ компилируется в машинный код, а в машинном коде такой информации нету — только сплошные адреса.

Добавлено через 1 минуту
Вы могли попытаться как-нибудь подключится из программы к исходному коду с помощью отладчика. Но только я не знаю как это сделать
1
System16v
3 / 3 / 1
Регистрация: 19.02.2014
Сообщений: 115
02.06.2015, 12:12 #19
mymedia, ну имя класса то на экран вывести можно как тут выше написано через typeid(*this).name , ток для чего его выводить,если имя класса неизменно и постоянно одинаковое , а меняются только созданные объекты класса,собственно имена которых и хотелось бы видеть . Можно конечно просто в конструктор запихнуть вызов функции,которая просто бы выдавала содержимое объекта,но в лабе 4-5 объектов,и для каждого несколько раз вызываются кострукторы\деструкторы,и если на каждое сообщение кон-ра\дес-ра выдавать содержимое объекта,в глазах зарябит,и не очень удобно смотреть. Эх,придется значит на адреса объектов только и смотреть. На счет отладчика,я об этом тоже ничего не знаю,т.к. начал недавно C++ изучать
0
castaway
Эксперт С++
4927 / 3034 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
02.06.2015, 12:12 #20
В GCC можно получить полное имя метода, в которое входит имя класса. Его можно "обрезать" и получить имя класса.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
class MyClass {
public:
    void foo() { std::cout << __PRETTY_FUNCTION__ << std::endl; }
};
 
int main()
{
    MyClass c;
    c.foo();
    return 0;
}
0
02.06.2015, 12:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2015, 12:12

При перегрузке оператора для класса не получается использовать имя переменной такое же, как в описании класса
Описал первый класс,затем - описал второй класс, используя первый,и когда начал...

Составить программу, которая вводит с клавиатуры имя и год рождения лица и выводит на экран "Привет Имя, тебе Р лет:).
Буду благодарен. =(( 1. Составить программу, которая вводит с клавиатуры имя и...

как вывести имя программы? именно имя, то что видно в провонике example.exe
собственно вопрос ^. это возможно? Добавлено через 18 минут догадался,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru