質問: ``` #include struct Rect { float m_position; float m_size; Rect(float const& _position, float const& _size); void Draw(); }; Rect::Rect(float const& _position, float const& _size) :m_position(_position) , m_size(_size) {} void Rect::Draw() { std::cout << m_position << std::endl; std::cout << m_size << std::endl; } Rect rect=Rect(100, 200); /***********デバックエラー Rect rect; rect.Rect(100, 200); **************************/ int main() { rect.Draw(); return 0; } ``` 確認というかたちになってしまうかもしれませんが、 上のソースコード「Rect rect=Rect(100, 200);」の部分なのですが、 これは、構造体Rect(基底クラス?)を rect(派生クラス?)に引き継ぎ、rect=Rect(100,200)で初期化(代入)。ということでしょうか?私は Rect rect; rect.Rect(100, 200); でやろうとしたのですが、エラーが出てしまいました。 Rect(float const& _position, float const& _size) :m_position(_position) , m_size(_size) これは基底クラスのコンストラクタであって、派生クラスではつかえないということでしょうか? このような考え方であっているのであれば、rect=Rect(100,200)の仕様がよくわかりません。 派生クラス内のコンストラクタはどのようになっているのでしょうか? 基底クラスと中身は同じで、rect内は ``` struct rect { float m_position; float m_size; Rect(float const& _position, float const& _size); void Draw(); }; ``` このようになっているのでしょうか? そして構造体rect(派生)とコンストラクタRectの型が合わずエラーが起きてしまう。 なので上記のようにrect=Rect(100,200)でrectクラス(派生)のRectに代入しているのでしょうか? まったくの的外れだったらすみません。<(_ _)> それとちなみに Rect(float const& _position, float const& _size) :m_position(_position) , m_size(_size) ここで使っている「&」はネットで調べたら、参照渡しとわかりましたが、これは今後必要なのでしょうか? 「&」:元の変数に別名をつける記法である(ここで使うの場合) 「&」がなくても引数の名前は変えられる気がしますが..... 「&」がなくてもデバック結果は変わりませんでした。 的外れのことを書いていたらすみません。<(_ _)> どなたかわかる方どうか教えてください<(_ _)>
回答: > > これは、構造体Rect(基底クラス?)を rect(派生クラス?)に引き継ぎ、rect=Rect(100,200)で初期化(代入)。ということでしょうか?私は > > Rect rect; > > rect.Rect(100, 200); > > でやろうとしたのですが、エラーが出てしまいました。 > > > このやり方ではデフォルトコンストラクタがないので、出来ません。 やりたいならポインターを使ってnewするのが良いでしょう。 ``` Rect *rect; rect = new Rect(100, 200); ``` > > このようになっているのでしょうか? > > > ``` float a; a = .0f; ``` この場合、float型の変数「a」となります。同様にRect型の変数「rect」となります。 ですので、構造体もクラスも変数も**インスタンスする**という意味では同じ考え方になります。