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

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

ただいまの
回答率

91.03%

  • Xcode

    3496questions

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

  • C++

    2927questions

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

  • MacOS(OSX)

    1632questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 198

shibata22

score 4

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

#include <iostream>
#include <typeinfo>
using namespace std;

//Vehicle宣言
class Vehicle{
protected:
    int speed;
public:
    void setSpeed(int s);
    virtual void show() = 0;
};

//Car宣言
class Car : public Vehicle{
private:
    int num;
    double gas;
public:
    Car(int n,double g);
    void show();
};

//Plane宣言
class Plane : public Vehicle{
private:
    int flight;
public:
    Plane(int f);
    void show();
};

//Vehicle関数定義
void Vehicle::setSpeed(int s){
    speed = s;
    cout << "速度を" << speed << "にしました。\n";
}

//Car関数定義
Car::Car(int n, double g){
    num = n;
    gas = g;
    cout << "ナンバー" << num << "ガソリン量" << gas << "の車を作成しました。\n";
}

void Car::show(){
    cout << "車のナンバーは" << num << "です。\n";
    cout << "ガソリン量は" << gas << "です。\n";
    cout << "速度は" << speed << "です。\n";
}

//Plane関数定義
Plane::Plane(int f){
    flight = f;
    cout << "便" << flight << "の飛行機を作成しました。\n";
}

void Plane::show(){
    cout << "飛行機の便は" << flight << "です。\n";
    cout << "速度は" << speed << "です。\n";
}

//main関数
int main(){
    Vehicle* pVc[2];

    Car car1(1234,20.5);
    Plane p1n1(232);

    pVc[0] = &car1;
    pVc[1] = &p1n1;

    for(int i=0; i<2; i++){
        if(typeid(*pVc[i]) == typeid(Car)){
            cout << (i+1) << "番目は" << typeid(Car).name() << "です。\n";
        }else{
            cout << (i+1) << "番目は" << typeid(Car).name() << "ではありません。" << typeid(*pVc[i]).name() << "です。\n";
        }
    }
}


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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+5

こんにちは。

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

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

#include <iostream>
#include <string>

#include <cxxabi.h>
std::string getNameByTypeInfo(std::type_info const& iTypeInfo)
{
    char*   aName;
    int status = 0;
    aName = abi::__cxa_demangle(iTypeInfo.name(), 0, 0, &status);
    std::string ret(aName);
    std::free(aName);
    return ret;
}


struct Foo { };
int main()
{
    std::cout << typeid(Foo).name() << "\n";
    std::cout << getNameByTypeInfo(typeid(Foo)) << "\n";
}

// 実行結果
3Foo
Foo

wandboxで確認してます。


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/09 02:25

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

    キャンセル

  • 2017/10/11 10:37

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

    キャンセル

  • 2017/10/15 08:31

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

    キャンセル

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

  • ただいまの回答率 91.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    java 進数

    javaです 「数」を表すNumberクラスを考える。Numberクラスを基底クラスとして定義し、整数に対し2進数、8進数、10進数、16進数の文字列を返すメソッドをもつ派生

  • 解決済

    double型の範囲について

    前提・実現したいこと 毎度お世話になっております。グラフで曲線を描きたいと思っております。 結果を格納する変数にdouble型を用いているのですが、途中から値がおかしくなります

  • 受付中

    Java 初心者です

    import java.util.Scanner; class car{ private int speed; public void speedUp(){ if(speed 

  • 解決済

    GAS⇔html間の値の渡し方

    前提・実現したいこと GASでVBAでいうとユーザーフォームのようなものを作るために、UserForm.htmlを作成し、そこにテキストボックスなどを配置し、その値をGAS側で受け

  • 解決済

    平均と最大のメソッド、配列についてです。

    市町村のデータをソートし、その平均と最大、最小を求めたいのですが、 平均と最大がうまくできません。 平均は"二項演算子'+'のオペランド型が不正です"と表示され、intからTown

  • 受付中

    gasで自身をスクレイピングしたい

    前提・実現したいこと google apps scriptでwebアプリを公開しました そのscriptから、定期的に自身にアクセスを当て、スクレイピングしたいと思い、以下のコード

  • 解決済

    GASのスプレッドシート 配列 高速化

    前提・実現したいこと ここに質問したいことを詳細に書いてください スプレッドシートにランダム関数を最終行まで(約3000個)、一列に並べるスクリプトを作りたい 発生している問題

  • 受付中

    ヘロンの公式を用いて三角形の面積を求める。

    前提・実現したいこと 2次元空間上の点のクラス Point2D Point2D のインスタンス 2点 a と b, 及び原点からなる3角形のクラス Triangle を作成する。

同じタグがついた質問を見る

  • Xcode

    3496questions

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

  • C++

    2927questions

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

  • MacOS(OSX)

    1632questions

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