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

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

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

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

C++

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

2499閲覧

派生クラスを基底クラスのポインタに代入して配列に代入出来ない理由が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

ポインタ

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

C++

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2021/07/02 04:30

提示コードのint main()関数の下部のrender.push_back();関数です。派生クラスのインスタンスを基底クラスのポインタ変数で確保してそれを基底クラスのポインタ配列に入れているのですがなぜエラーになるのでしょか?

エラー[ E0312 "std::shared_ptr<Player>" から "std::shared_ptr<Render>" への適切なユーザー定義変換が存在しません]

cpp

1#include <iostream> 2#include <vector> 3 4#define PI ( (double)3.14159265359 ) //PI 5#define RADIAN ( 360.0 / (PI * 2.0 ) ) //ラジアンを度数で取得 6 7 8class Transform_2D 9{ 10protected: 11 int positoin; 12 13public: 14 15 16 Transform_2D() 17 { 18 std::cout << "Transform_2D()" << std::endl; 19 } 20}; 21 22class Render 23{ 24public: 25 26 virtual void Draw() = 0; 27 virtual void Update() = 0; 28 29 30 Render() 31 { 32 std::cout<<"Render" << std::endl; 33 } 34 35}; 36 37 38class Sprite : Transform_2D 39{ 40public: 41 42 void Draw() 43 { 44 std::cout << "draw()" << std::endl; 45 } 46 47 void Update() 48 { 49 std::cout << "update()" << std::endl; 50 } 51 52 53 54 55 Sprite() : Transform_2D() 56 { 57 58 } 59 60}; 61 62class Player : Render 63{ 64public: 65 66 void Draw() 67 { 68 std::cout << "draw()" << std::endl; 69 } 70 71 void Update() 72 { 73 std::cout << "update()" << std::endl; 74 } 75 76 Player():Render() 77 { 78 79 } 80 81private: 82 Sprite sprite; 83 84}; 85 86class Camera 87{ 88public: 89 Camera() { }; 90 91 92}; 93 94 95int main() 96{ 97 std::vector<std::shared_ptr<Render>> render(0); 98 99 std::shared_ptr<Render> player = std::make_shared<Player>(); 100 render.push_back(player);//ここの行 101 102 103 104 105 106 return 0; 107} 108

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

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

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

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

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

guest

回答1

0

ベストアンサー

private継承しているからでしょう.

C++

1class Player : Render //←ここ

投稿2021/07/02 04:36

fana

総合スコア11708

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

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

退会済みユーザー

退会済みユーザー

2021/07/02 06:50

protectedとも試しまたがだめでした。private protectedはダメなのですね。勉強になりました。
fana

2021/07/02 08:14 編集

今回のように何も書かないとprivate継承になっちゃうので, うっかり "public" って書くのを忘れててこのようなエラーに直面することが割とよくある.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問