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

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

新規登録して質問してみよう
ただいま回答率
85.48%
ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

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

Q&A

解決済

2回答

1388閲覧

スマートポインタの実引数にthisポインターを使用する方法

suittizihou

総合スコア27

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

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

0グッド

0クリップ

投稿2019/01/07 16:57

現在DxLibを用いてゲームのフレームワークを作っています。

C++

1#include "Actor.h" 2#include <memory> 3 4void Actor::draw() { 5 DrawGraph(position_.x, position_.y, renderer.GetTextureHandle(texture_), TRUE); 6} 7void Actor::react(std::shared_ptr<Actor> other) {} 8 9bool Actor::is_collide(std::shared_ptr<Actor> other)const { 10 DXrect my_rect{ position_.x, position_.y, position_.x + size_.x, position_.y + size_.y }; 11 DXrect other_rect{ other->position_.x, other->position_.y, 12 other->position_.x + other->size_.x, other->position_.y + other->size_.y }; 13 14 return CollisionRectAndRect(&my_rect, &other_rect) == DX_TRUE; 15} 16 17// 衝突処理 18void Actor::collide(std::shared_ptr<Actor> other) { 19 if (is_collide(other)) { 20 react(other); 21 22 23// ここが問題の場所=================================================================== 24 other->react(*this); 25// ================================================================================= 26 } 27}

Actorクラスというゲームに登場する全てのキャラクターが継承するベースクラスのcppファイルです。

ここのreactに自分自身のポインターを渡したいのですが、この方法ではエラーになってしまい困っています、、、。

何かいい方法はないでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。

reactは本当にstd::shared_ptrを受け取らないとダメなのでしょうか?
その使い方の場合、当たり前ですがcollideから戻ってくるまでthisが破棄されないことをcollideの呼び出し側で保証する必要があります。従って、このケースのreactはstd::shared_ptrで受け取って破棄されないことを保証する必要は無いのではないでしょうか?
であれば、生ポインタ(Action*)を受け取るprivateなreact_impl的な関数を作って、その中で実処理を行い、react_implの呼び出し側で生ポインタが破棄されないことを保証すればクリアできると思います。

ところで、メモリに関しては、誰がいつ開放するのかきちんと設計しないと確実にハマりますので、安易にstd::shared_ptrを使うのはリスキーと思います。(特にstd::shared_ptrは意外にハマりポイントが多いですよ。)
例えば、ツリー構造を実装する場合など、どうしてもthisからstd::shared_ptrを作りたいケースはありますので、そのような時はyumetodoさん回答のshared_from_thisが有用です。

投稿2019/01/08 02:45

Chironian

総合スコア23272

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

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

suittizihou

2019/01/08 08:06

具体的な解決方法、並びに参考サイトなどなど、本当にありがとうございます。
guest

0

shrared_from_thisをググってみましょう。きっとあなたの求めているものです。

投稿2019/01/07 17:56

yumetodo

総合スコア5850

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

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

suittizihou

2019/01/08 08:05

ありがとうございます。 この部分のエラーはなくなったのですが、別のところからエラーが出てしまったのでまた色々調べようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問