質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1715閲覧

C++ typeid演算子の値がサンプルと違う。

shibata22

総合スコア12

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2017/10/08 15:57

現在macOSにて、書籍「やさしいC++ 第5版」の写経をしています。
そこで今、typeid演算子を使って派生クラスのオブジェクトのアドレスを入れた基底クラスのポインタ配列からそれがどの派生クラスかを判断するサンプルを実行したところ。
クラス名 だけでなく。
数字 + クラス名が表示されてしまうということが起こっています。

C++

1#include <iostream> 2#include <typeinfo> 3using namespace std; 4 5//Vehicle宣言 6class Vehicle{ 7protected: 8 int speed; 9public: 10 void setSpeed(int s); 11 virtual void show() = 0; 12}; 13 14//Car宣言 15class Car : public Vehicle{ 16private: 17 int num; 18 double gas; 19public: 20 Car(int n,double g); 21 void show(); 22}; 23 24//Plane宣言 25class Plane : public Vehicle{ 26private: 27 int flight; 28public: 29 Plane(int f); 30 void show(); 31}; 32 33//Vehicle関数定義 34void Vehicle::setSpeed(int s){ 35 speed = s; 36 cout << "速度を" << speed << "にしました。\n"; 37} 38 39//Car関数定義 40Car::Car(int n, double g){ 41 num = n; 42 gas = g; 43 cout << "ナンバー" << num << "ガソリン量" << gas << "の車を作成しました。\n"; 44} 45 46void Car::show(){ 47 cout << "車のナンバーは" << num << "です。\n"; 48 cout << "ガソリン量は" << gas << "です。\n"; 49 cout << "速度は" << speed << "です。\n"; 50} 51 52//Plane関数定義 53Plane::Plane(int f){ 54 flight = f; 55 cout << "便" << flight << "の飛行機を作成しました。\n"; 56} 57 58void Plane::show(){ 59 cout << "飛行機の便は" << flight << "です。\n"; 60 cout << "速度は" << speed << "です。\n"; 61} 62 63//main関数 64int main(){ 65 Vehicle* pVc[2]; 66 67 Car car1(1234,20.5); 68 Plane p1n1(232); 69 70 pVc[0] = &car1; 71 pVc[1] = &p1n1; 72 73 for(int i=0; i<2; i++){ 74 if(typeid(*pVc[i]) == typeid(Car)){ 75 cout << (i+1) << "番目は" << typeid(Car).name() << "です。\n"; 76 }else{ 77 cout << (i+1) << "番目は" << typeid(Car).name() << "ではありません。" << typeid(*pVc[i]).name() << "です。\n"; 78 } 79 } 80}

これの実行結果は
ナンバー1234ガソリン量20.5の車を作成しました。
便232の飛行機を作成しました。
1番目は3Carです。
2番目は3Carではありません。5Planeです。
Program ended with exit code: 0

となります。本にあるサンプルではクラス名はしっかり Car Plane と表記されているのに対し、 3Car 5Plane と表示されてしまいます。何が原因なのでしょうか。

xcodeに原因があるのかと考えterminalから実行してみましたが、結果は同じでした。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

gcc系のコンパイラではtype_info.name()が返却する型名は「マングル」されています。
「デマングル」すれば見慣れた型名になります。

通常のclangならgccと同じ方法で「デマングル」できました。Apple用にカスタマイズされたclangが同じでいけるかどうか把握していませんが、試してみる価値はあると思います。

C++

1#include <iostream> 2#include <string> 3 4#include <cxxabi.h> 5std::string getNameByTypeInfo(std::type_info const& iTypeInfo) 6{ 7 char* aName; 8 int status = 0; 9 aName = abi::__cxa_demangle(iTypeInfo.name(), 0, 0, &status); 10 std::string ret(aName); 11 std::free(aName); 12 return ret; 13} 14 15 16struct Foo { }; 17int main() 18{ 19 std::cout << typeid(Foo).name() << "\n"; 20 std::cout << getNameByTypeInfo(typeid(Foo)) << "\n"; 21} 22

// 実行結果
3Foo
Foo

wandboxで確認してます。


因みにVisual C++の場合は、typeid(型).name()でデマングルされた文字列が返却されますので、もしかするとお使いのサンプルはVC++で動作確認されているものではないでしょうか?

投稿2017/10/08 16:31

編集2017/10/08 16:33
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shibata22

2017/10/08 17:25

デマングル化でうまくいきました。ありがとうございます。おっしゃる通り、サンプルコードはVC++を元に進めているものでした。????
yohhoy

2017/10/11 01:37

type_info型のname()メンバ関数は「実装定義の文字列」を返す、つまりコンパイラによって結果がまちまちです。"必ずこのような文字列を返す"という仕様になっていないため、ログ記録やデバッグ時の参考用にとどめたほうがよいです。 https://cpprefjp.github.io/reference/typeinfo/type_info/name.html
shibata22

2017/10/14 23:31

なるほどありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問