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

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

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

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

解決済

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

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

2回答

0評価

0クリップ

489閲覧

投稿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

// ##################################### 描画 ##################################### void FrameWork::Camera::View(std::shared_ptr<Actor> actor) { glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO); glViewport(0, 0, windowContext->getSize().x, windowContext->getSize().y); //actor->Renderer_Depth(getViewPerspective()); glBindFramebuffer(GL_FRAMEBUFFER, frameBufferFBO); glViewport(0, 0, windowContext->getSize().x, windowContext->getSize().y); glEnable(GL_DEPTH_TEST); // actor->Renderer(getViewPerspective()); glDepthFunc(GL_LEQUAL); actor->Renderer(getViewOrthographic()); // actor->Renderer(getViewPerspective()); glDepthFunc(GL_LESS); glBindFramebuffer(GL_FRAMEBUFFER,0); }
Entry.cpp

cpp

#include "../header/Entry.hpp" #include <iostream> #include "../header/Game.hpp" #include "../FrameWork/FrameWork/FrameWork.hpp" Entry::Entry() { camera = std::make_shared<FrameWork::Camera>(); game = std::make_shared<Game>(); } void Entry::Update() { } void Entry::Renderer() { /////////////////////////////////////////////////// camera->View(game); / /////////////////////////////////////////////////// } void Entry::Loop() { camera->ClearBuffer(); Update(); Renderer(); camera->RendererBuffer(); } Entry::~Entry() { }
Game.hpp

cpp

#ifndef ___GAME_HPP___ #define ___GAME_HPP___ #include "../FrameWork/FrameWork/FrameWork.hpp" #include <glm/glm.hpp> class Game : FrameWork::Actor { public: Game(); ~Game(); void Update(); void Renderer(const glm::mat4 view)const; private: FrameWork::Texture texture; }; #endif
Game.cpp

cpp

#include "../header/Game.hpp" Game::Game() : Actor() { texture = FrameWork::LoadTexture("Asset/resource.png"); } void Game::Update() { } void Game::Renderer(const glm::mat4 view)const { //FrameWork::RendererSprite(camera->getViewPerspective(),texture,glm::vec3(50,50,-1),glm::ivec2(3,3),glm::ivec2(32,16)); FrameWork::RendererSprite(view,texture,glm::vec3(50,50,-1),glm::ivec2(3,3),glm::ivec2(32,16)); } Game::~Game() { }
Actro.hpp

cpp

#ifndef ___ACTOR_HPP_ #define ___ACTOR_HPP_ #include <memory> #include <GL/glew.h> #include <glm/glm.hpp> namespace FrameWork { class Actor { public: Actor(); ~Actor(); virtual void Update() = 0; virtual void Renderer(const glm::mat4 view)const = 0; protected: }; } #endif

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

C++

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