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

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

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

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

Q&A

解決済

2回答

652閲覧

オブジェクトのポインタへの代入

Snow_man_nano

総合スコア3

C++

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

0グッド

0クリップ

投稿2020/05/13 16:46

疑問点

オブジェクトのポインタに代入を行う際、下のコードのようにアスタリスクを用いた代入を行うとsementation faultになってしまいます。*a.child = bの部分をa.child = &bとすれば所望の出力結果を得られます。

オブジェクトのポインタへの代入の際intのポインタへの代入とは違い、下のコードような代入はご法度ということなのでしょうか。また別件になり申し訳ないのですが、下のコードのStudentクラスのように、メンバ変数に自身のポインタを有するクラスは推奨されないのでしょうか。抽象的な質問で申し訳ございません。

該当のソースコード

cpp

1#include <bits/stdc++.h> 2 3class Student 4{ 5public: 6 Student(int i, char* _name){ 7 number = i; 8 name = _name; 9 child = nullptr; 10 } 11 int number; 12 char* name; 13 Student* child; 14}; 15 16int main(){ 17 Student a = Student(1, "john"); 18 Student b = Student(2, "tom"); 19 *a.child = b; 20 std::cout << a.child->name << std::endl; 21 return 0; 22} 23

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

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

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

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

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

guest

回答2

0

ベストアンサー

a.child が nullptr や不定値で *a.child を参照してはいけません。
確保された Student の領域のアドレスでなければなりません。

C++

1#include <bits/stdc++.h> 2 3class Student 4{ 5public: 6 Student(int i, const char* _name) { // const char * にしましょう。 7 number = i; 8 name = _name; 9 child = nullptr; 10 } 11 int number; 12 const char* name; // const char * にしましょう。 13 Student* child; 14}; 15 16int main() { 17 Student a = Student(1, "john"); 18 Student b = Student(2, "tom"); 19 a.child = new Student(0, "nobody"); // ★領域を確保 20 *a.child = b; 21 std::cout << a.child->name << std::endl; 22 return 0; 23}

連結リストや木構造など、同一クラスへのポインタを持つクラスはいくらでもあります。
でも、使用するときは、a.child = &b; が普通です。

追記
a.child = new Student(0, "nobody"); の代わりに、
Student c(0, ""); a.child = &c; と書いても落ちなくなります。
とにかく、*a.child = b; で b の実体を丸ごとコピーするためには、
その前に a.child が Student の領域を指していなければなりません。

a.child = はポインタへの代入ですが、
*a.child = はポインタへの代入ではありません。実体のコピーです。

投稿2020/05/13 20:11

編集2020/05/14 00:53
kazuma-s

総合スコア8224

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

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

Snow_man_nano

2020/05/14 01:48

ポインタがStudentの領域を指すようにするとの説明非常に分かりやすかったです。ありがとうございます。
guest

0

nullptrへアクセスしているためsegmentation faultになっていることに気づきました。お目汚し失礼いたしました。

クラスコンストラクタのchild = nullptrを消去した場合、a.childにはポインタが割当てられているのにもかかわらず、*a.child=bという代入がsegmentation faultになりました。a.childに割り当てられたポインタは正規の初期化した値でないため代入ができないという認識でよろしいのでしょうか。

投稿2020/05/13 16:52

編集2020/05/13 17:09
Snow_man_nano

総合スコア3

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

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

SHOMI

2020/05/13 17:16

>クラスコンストラクタのchild = nullptrを消去した場合、a.childにはポインタが割当てられているのにもかかわらず ポインタが割当てられているとはどういう意味で言っていますか? それはただの不定値です。
Snow_man_nano

2020/05/14 01:42

std::cout <<a.childが何らかのアドレスを出力していたので、ポインタが割り当てられていると思ってしまいました。不定値と教えていただきスッキリしました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問