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

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

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

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

Q&A

解決済

2回答

2958閲覧

派生クラスを基底クラスにアップキャストできない原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2022/02/03 04:09

提示コードですがActorクラスを継承したGameクラスをcamera->View()関数でActorクラスにアップキャストしたいのですが下記のエラーになりますこれはなぜでしょうか?

Console
shigurechan@shigurechan-System-Product-Name:~/prg/TopDownGame$ make g++ -g -c -MMD -MP source/Entry.cpp -o object/Entry.o source/Entry.cpp: In member function ‘void Entry::Renderer()’: source/Entry.cpp:19:18: error: cannot convert ‘shared_ptr<Game>’ to ‘shared_ptr<FrameWork::Actor>’ 19 | camera->View(game); | ^~~~ | | | shared_ptr<Game> In file included from source/../header/../FrameWork/FrameWork/FrameWork.hpp:15, from source/../header/Entry.hpp:4, from source/Entry.cpp:1: source/../header/../FrameWork/FrameWork/../header/Camera.hpp:44:36: note: initializing argument 1 of ‘void FrameWork::Camera::View(std::shared_ptr<FrameWork::Actor>)’ 44 | void View(std::shared_ptr<Actor> actor); | ~~~~~~~~~~~~~~~~~~~~~~~^~~~~ make: *** [Makefile:25: object/Entry.o] エラー 1 shigurechan@shigurechan-System-Product-Name:~/prg/TopDownGame$
Camera.cpp

cpp

1 2// ##################################### 描画 ##################################### 3void FrameWork::Camera::View(std::shared_ptr<Actor> actor) 4{ 5 6 glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO); 7 glViewport(0, 0, windowContext->getSize().x, windowContext->getSize().y); 8 9 //actor->Renderer_Depth(getViewPerspective()); 10 11 glBindFramebuffer(GL_FRAMEBUFFER, frameBufferFBO); 12 glViewport(0, 0, windowContext->getSize().x, windowContext->getSize().y); 13 14 glEnable(GL_DEPTH_TEST); 15// actor->Renderer(getViewPerspective()); 16 17 glDepthFunc(GL_LEQUAL); 18 actor->Renderer(getViewOrthographic()); 19// actor->Renderer(getViewPerspective()); 20 glDepthFunc(GL_LESS); 21 22 glBindFramebuffer(GL_FRAMEBUFFER,0); 23}
Entry.cpp

cpp

1#include "../header/Entry.hpp" 2#include <iostream> 3#include "../header/Game.hpp" 4#include "../FrameWork/FrameWork/FrameWork.hpp" 5 6Entry::Entry() 7{ 8 camera = std::make_shared<FrameWork::Camera>(); 9 game = std::make_shared<Game>(); 10} 11 12void Entry::Update() 13{ 14 15} 16 17void Entry::Renderer() 18{ 19/////////////////////////////////////////////////// 20 camera->View(game); / 21/////////////////////////////////////////////////// 22} 23 24void Entry::Loop() 25{ 26 camera->ClearBuffer(); 27 28 29 Update(); 30 Renderer(); 31 32 33 34 camera->RendererBuffer(); 35 36} 37 38Entry::~Entry() 39{ 40 41} 42 43
Game.hpp

cpp

1#ifndef ___GAME_HPP___ 2#define ___GAME_HPP___ 3 4#include "../FrameWork/FrameWork/FrameWork.hpp" 5#include <glm/glm.hpp> 6 7class Game : FrameWork::Actor 8{ 9public: 10 Game(); 11 ~Game(); 12 13 void Update(); 14 void Renderer(const glm::mat4 view)const; 15private: 16 17 FrameWork::Texture texture; 18 19}; 20 21#endif 22
Game.cpp

cpp

1#include "../header/Game.hpp" 2 3Game::Game() : Actor() 4{ 5 texture = FrameWork::LoadTexture("Asset/resource.png"); 6} 7 8void Game::Update() 9{ 10 11} 12void Game::Renderer(const glm::mat4 view)const 13{ 14 //FrameWork::RendererSprite(camera->getViewPerspective(),texture,glm::vec3(50,50,-1),glm::ivec2(3,3),glm::ivec2(32,16)); 15 FrameWork::RendererSprite(view,texture,glm::vec3(50,50,-1),glm::ivec2(3,3),glm::ivec2(32,16)); 16} 17 18Game::~Game() 19{ 20 21} 22
Actro.hpp

cpp

1#ifndef ___ACTOR_HPP_ 2#define ___ACTOR_HPP_ 3 4#include <memory> 5#include <GL/glew.h> 6#include <glm/glm.hpp> 7namespace FrameWork 8{ 9 class Actor 10 { 11 public: 12 13 Actor(); 14 ~Actor(); 15 16 virtual void Update() = 0; 17 virtual void Renderer(const glm::mat4 view)const = 0; 18 19 protected: 20 21 }; 22} 23#endif

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

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

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

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

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

guest

回答2

0

ベストアンサー

class Game : FrameWork::Actor { ... };

private継承しているからでは.

class Game : public FrameWork::Actor { ... };

とするのではダメなのでしょうか?

投稿2022/02/03 04:21

fana

総合スコア11753

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

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

退会済みユーザー

退会済みユーザー

2022/02/03 04:25

あっ忘れてしました。質問ですがgame をactotrにアップキャストする行為ではないという解答がありますがこれはどういう名前の行為なのでしょうか?
fana

2022/02/03 06:00 編集

private継承でダメだった理由は,このリンク先の「要件」ってところに書いてある. > (9) C++11 : Y*がT*に暗黙変換可能でない場合、この関数はオーバーロード解決から除外される。 private継承だと,Game* が Actor* に暗黙変換できないってことね.
fana

2022/02/03 06:03

…っていうのが私の解釈だけど,そもそも > …という解答がありますが… という場合には,その話が出た側で問うのが良いのでは.
SaitoAtsushi

2022/02/03 06:31

C++ 用語にアップキャストというものはありません。 オブジェクト指向用語でいうところのアップキャストにあてはまるようなものをなんとなくアップキャストと呼んだりするようなことは習慣的におこなわれていますが定義がないので厳密にどのような場合のことなのかは言えません。 また、更にいうならば C++ 的には「キャスト」は明示的に型変換する文法のことであって型変換そのもののことを指しません。 型変換は型変換 (type convert) または単に変換 (convert) といいます。 質問の例をどう呼ぶかというと「shared_ptr<Game> から shared_ptr<FrameWork::Actor> への変換」としか言いようがないです。 エラーメッセージの表現は C++ 的に妥当なものです。
guest

0

エラーメッセージのとおりです。

そもそも、やろうとしていることが「GameクラスをActorクラスにアップキャスト」ではないです。

投稿2022/02/03 04:12

maisumakun

総合スコア145509

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

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

退会済みユーザー

退会済みユーザー

2022/02/03 04:16

gameをactorに変更できませんとはなぜでしょうか?以前別のプロジェクトではできたのですが
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.42%

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

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

質問する

関連した質問