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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

Q&A

解決済

4回答

11958閲覧

クラスのメンバ変数に、引数から与えた要素数の配列を定義したい

Amanokawa

総合スコア41

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

0グッド

1クリップ

投稿2018/01/17 03:22

C++を始めたばかりの初心者です。
クラスを定義する際に、メンバ変数もまとめて定義しないといけませんよね。
メンバ変数に配列を定義したいとき、配列の要素数をどのように扱っていいかわかりません。
インスタンス化するときのコンストラクタで配列の要素数を与えたいのです。
あとからメンバ変数を追加出来たら簡単に解決と思うのですが可能でしょうか?
クラスで配列を使うことは多いと思います。みなさんはどのようにして解決しているのか教えてください。

(vectorを使って配列数分push_back()を行って対処していたのですが、クラスの再帰呼び出しを行うに当たって、vectorでは都合が悪いのです。)

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

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

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

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

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

yohhoy

2018/01/17 07:15

あなたが実現したい機能・動作、特に「クラスの再帰呼び出し」「なぜ・どのようにvectorでは都合が悪いのか」を具体的に説明されたほうが良いかと思います。
guest

回答4

0

こんにちは。

インスタンス化するときのコンストラクタで配列の要素数を与えたいのです。

このような時は、std::vectorを使うケースがほとんどと思います。
一般に「クラスの再帰呼び出し」はできませんので、何か勘違いされているのではないでしょうか?
再帰呼び出しできるのは関数です。

あとからメンバ変数を追加出来たら簡単に解決と思うのですが可能でしょうか?

C++は静的型付け言語ですので、それは不可能です。
私はこれができないことを好ましく思います。(人によってはそう思わない人もいるでしょうから、ある意味人それぞれですが、熟練者には少ないような気がします。)

他に、テンプレートで解決する手段もありますが、「C++を始めたばかりの初心者」さんには荷が重すぎると思います。まずは、std::vectorが本当に使えないのか確認しましょう。std::vectorを使えるだけでもなかなかのものですよ。

投稿2018/01/17 03:37

Chironian

総合スコア23272

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

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

0

ベストアンサー

C++

1class foo { 2 int* data; 3public: 4 foo(int n) { data = new int[n]; } 5 ~foo() { delete[] data; } 6 ... 7};

...なんて回答を期待してはいないよなー...

投稿2018/01/17 03:31

episteme

総合スコア16614

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

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

Amanokawa

2018/01/18 04:33

まさにこれがやりたい事でした。 ありがとうございました。
episteme

2018/01/18 05:45

...なんで? class foo { vector<int> data; public: foo(int n) : data(n) {} ... でもおんなじぢゃん。vectorだとナニが問題なん?
Amanokawa

2018/01/23 01:53

速度を重視したアルゴリズムを作っているのが理由です。vectorよりも早いとどこかで見ました。 自分の知識が浅すぎなのでvectorで作っても同程度の速度だったかもしれませんね。 そもそもポインタからの動的確保を知らなかった時点でお察しレベルですし・・・ newで作ったおかげでメモリリークの対処についてもすこし知識が増えました。
guest

0

再帰呼び出しが全く無関係とは。まるで見当外れだったようなので削除します。

投稿2018/01/17 12:35

編集2018/01/18 09:43
colonq

総合スコア88

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

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

0

コンパイルする時にコンパイラはメモリ配置を考えないといけないため、固定長の配列はコンパイル時に大きさが決まっていないといけません。
例外として可変長配列(VLA)と呼ばれるものがありますが、これはC11以降では言語仕様として必須機能ではなく、コンパイラ依存になります。
そのため固定長配列を実行時に決定する必須な仕様は言語仕様としてはありません。
動的配列ではいけないのでしょうか?vectorをお使いになられていますがvectorも動的にメモリを確保してますよ。
再帰呼び出しをするため都合が悪いだけだとよくわからないので、どう都合が悪いとかサンプルコードがあれば、適切なコンテナ等を考えられます。

投稿2018/01/17 03:49

m_yoko

総合スコア156

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問