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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C++

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

Q&A

解決済

1回答

1229閲覧

【C++】他のクラスの特定の変数の値だけを取り出す方法を教えてください!!!!!!!!!

KOTTON

総合スコア47

C++

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

0グッド

0クリップ

投稿2020/07/03 06:06

質問

例えば、第三者が作ったNumberというクラスが存在していたとして、その中に

1, 2, 3, 4というメンバ変数があったとします。

僕はその中から2, 3だけを取り出して、自前のクラスに保存したいです。

可能でしょうか?(実際には1や4の場所にはただの変数だけではなく、クラスポインタとかも存在している想定です)

コードの雛形

以下のコードに何らかを足して実装したいところです

cpp

1class MyNums { 2public: 3 int x2, x3; //2と3が入るべき変数 4} 5 6#define NumberAddress 0x313B5B0 //Numberクラスのインスタンスがこのアドレスに存在すると仮定します 7 8int main() { 9 MyNums* mynums = (MyNums*)NumberAddress; //特定のアドレスを始点にして自前クラスに入れる 10 std::cout << mynums->x2 << std::endl; 11}

このコード全体的に間違ってないといいんですがm(_ _)m
個人的な考えでは、コンストラクタなどでthisのアドレスに整数型分のサイズを足してずらすようなことをすればいい気がするんですが、自分で試したものは全部うまく動きませんでした。

MyNums() { this->x2 = *(uint32_t*)this + 0x4 }

By the way

この初期化方法ってコンストラクタ呼ばれるんでしょうか?
MyNums* mynums = (MyNums*)NumberAddress;

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

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

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

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

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

maisumakun

2020/07/03 06:17

Numberクラスはどのような形でしょうか?
KOTTON

2020/07/03 06:21

Numberクラスの構造は僕にもわからない前提なんですが、この例でいうと class Number { int x1, x2, x3, x4; Number() { x1 = 1; x2 = 2; x3 = 3; x4 = 4; } } これで十分じゃないんですかね? 実際はそれぞれの値がintじゃなかったりする場合も想定したいですが
guest

回答1

0

ベストアンサー

Numberクラスの構造は僕にもわからない前提なんですが

では、それをメモリダンプでもなんでもいいので確定させない限り、どうしようもありません

投稿2020/07/03 06:24

maisumakun

総合スコア146018

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

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

maisumakun

2020/07/03 06:25

「クラスの形がわからない」=「どこにデータが格納されているかわからない」ということです。それが判明しない限り、データは取れません。
maisumakun

2020/07/03 06:27

…というより、クラスが存在するとわかっていて、そのヘッダファイルすら手に入らない、という状況が一般には起きないかと思いますが、どのようなことをやっているのでしょうか?
KOTTON

2020/07/03 06:32 編集

ごめんなさい、私の伝え方が間違っていました。 そのクラスの中の欲しい値はわかります。ただ大きいクラスなので、自分が欲しいデータの前後にたくさんの謎の値がセットしてあるといった状況です。なので、その中から自分が欲しい値だけを取得したいというのが具体的な状況です。 そのクラスの構造をすべて文面で伝えるのはあまりにも困難なのでNumberというクラスを例として出させていただいた次第です。 いかがでしょうか!
maisumakun

2020/07/03 06:33 編集

> そのクラスの中の欲しい値の相対アドレス(オフセット)はわかります。 では、int *などの、メンバ変数を参照するのに正しい型を用意してポインタ演算するだけです。
KOTTON

2020/07/03 06:49 編集

ポインタ演算というのは int * num = クラスのアドレス + 目的の値へのオフセット これのことですかね 以下のように自前のクラスを初期化する瞬間に、キャスト対象のクラスのアドレスを取得する方法はありますか? MyNums* mynums = (MyNums*)NumberAddress; そのアドレスが分かればオフセットを使って目的の値を導き出せると思います。
maisumakun

2020/07/03 06:51

> 以下のように自前のクラスを初期化する瞬間に、対象のクラスの頭のアドレスを取得する方法はありますか? 「自前のクラスを初期化」は行われていません。NumberAddressの値が「対象のクラスの頭のアドレス」です。
KOTTON

2020/07/03 06:54

あ。。。。。 少し睡眠不足でとんちんかんなことを質問してしまった気がします。 仰る通りですね 申し訳ありません。 お付き合いいただきありがとうございました、ベストアンサーです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問