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

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

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

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

Q&A

解決済

3回答

1808閲覧

c++でクラス変数の初期化がうまくいきません

kamingout

総合スコア44

C++

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

0グッド

0クリップ

投稿2020/11/08 12:46

初歩的な質問ですみませんが、わかる方いましたら教えてください。

メンバクラスBを持つクラスAから、クラスBのメンバ変数を指定しようとしたところ、
メモリを読み取れませんというエラーが表示されました。
何が原因かわかりますか?
下記のプログラムのmain関数でエラーが発生します。

class CA { public: CB m_b; } class CB { private: std::string str1; std::string str2; public: void Initialize(std::string a, std::string b); } void CB::Initialize(std::string a, std::string b) { str1 = a; str2 = b; } int main() { CA a; a.m_b.Initialize("aaa", "bbb"); }

すみませんが、よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

提示してるソースコードではコンパイルが通りません...

下記ならコンパイル通ります。
また、実行しても特にエラーは出ません。

c++

1#include <string> 2 3class CB 4{ 5private: 6 std::string str1; 7 std::string str2; 8 9public: 10 void Initialize(std::string a, std::string b); 11}; 12 13class CA 14{ 15public: 16 CB m_b; 17}; 18 19void CB::Initialize(std::string a, std::string b) 20{ 21 str1 = a; 22 str2 = b; 23} 24 25int main() 26{ 27 CA a; 28 a.m_b.Initialize("aaa", "bbb"); 29} 30

投稿2020/11/08 13:01

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

  • クラス定義の最後に ; がないので構文解析が無茶苦茶になって変なところをエラーとして示してしまうと思います。
  • CA を定義するときには CB がまだ宣言されていないので定義の順序を変えるか前方宣言してください。
  • #include<string> がないので std::string を使えません。

投稿2020/11/08 12:59

SaitoAtsushi

総合スコア5684

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

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

0

ベストアンサー

CA, CB の宣言順の問題じゃなくて?

これ↓だと問題ありませんけど。

C++

1#include <string> 2 3class CB { 4private: 5 std::string str1; 6 std::string str2; 7public: 8 void Initialize(std::string a, std::string b); 9}; 10 11class CA { 12public: 13 CB m_b; 14}; 15 16void CB::Initialize(std::string a, std::string b) { 17 str1 = a; 18 str2 = b; 19} 20 21int main() { 22 CA a; 23 a.m_b.Initialize("aaa", "bbb"); 24}

投稿2020/11/08 12:58

episteme

総合スコア16612

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

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

kamingout

2020/11/08 14:57

>みなさま ご回答ありがとうございます。 上記回答の内容で解決しなかったため、追加で質問させていただきます。 ①クラスCA内の関数からm_cb.Initializeをしようとするときにm_cbのメンバ変数のメモリが読み込めないため、エラーが発生してしまいました。 ②①を解決しようと、m_cbをポインタにし、newで明示的にメモリ確保しようとしましたが、書き込みアクセス違反となってしまいました。 ③CAの関数内で、CBのインスタンスcbを生成し、生成したインスタンスcbがInitialize("aa","bb")を呼び出す場合は問題なく処理が行われました。 なぜ、上記のような問題が発生するのでしょうか...?
episteme

2020/11/08 15:12 編集

> ①クラスCA内の関数からm_cb.Initializeをしようとするときにm_cbのメンバ変数のメモリが読み込めないため、エラーが発生してしまいました。 ...わからんなー。 - "クラスCA内の関数"とはどれですか? -「なに」が"m_cbのメンバ変数のメモリが読み込めない"と言うてるんですか? コンパイラ? リンカ? プログラムの実行時? ほかのなにか?
kazatsuyu

2020/11/08 15:12

問題が発生しているコードを「そのまま」貼ることをオススメします。他の方がおっしゃっている通り、あなたの貼ったコードではまずコンパイラが通りませんし、それを解釈して動くようにするとepistemeさんの回答のようなコードになります。 回答のコードがとりあえずコンパイルが通って実行できることは、オンラインコンパイラにコピペして動かすなどすればわかります(→https://wandbox.org/permlink/phldMHj963kTWE2I) つまり、問題が解決しなかった原因は、回答のコードとあなたのコードの差の部分にあり、そこがどうなっているかはインターネットの向こう側であなたの貼ったコードを見るしかない回答者には分からないため、答えようがありません。
kamingout

2020/11/09 14:14

>epistemeさん、kazatsuyuさん すみません、少し複雑なコードなので簡略化した形でお伝えしておりました。 本日コード読み直したところ、凡ミスでうまく動いていないことに気づきました。。。 課題は解決済みとさせていただきます。 ご迷惑おかけしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問