-PR-
解決済み

クラスメンバをnewで宣言できますか?

  • 困ってます
  • 質問No.93978
  • 閲覧数368
  • ありがとう数4
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 83% (88/105)

こんにちは。
教えていただきたいのですが、クラスメンバ(変数)を動的に確保することは
できるのでしょうか?(一応やってみたのですが、エラーになってしまいました。)
それから、Newでの二次元配列の確保は、どうやったらよいのでしょうか?
ヘルプでもうまく探せません。
よろしくお願いします。
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.1
レベル9

ベストアンサー率 71% (59/82)

ポインタをクラスメンバにしておいて、
newが返すポインタをそこに入れる、
というのでだめですか?

class Integers {
 public:
  Integers() : ip(0) { }
  ~Integers() { if( ip != 0 ) delete[] ip; }

  allocate(int n){ ip = new int[n]; }

 private:
  int *ip;
};


2次元配列の確保は、こんな感じでどうでしょう?

int (*twodim)[CNUM]
 = reinterpret_cast<int (*)[CNUM]>(new int [CNUM * RNUM]);

CNUMとRNUMは列数、行数を表す定数です。
CNUM*RNUM個のintを確保して、
CNUM個のintをひとまとめにして指すポインタに
castして代入しています。

これで、twodim[1]は2行目のint配列の先頭を指すポインタになるので、
twodim[1][2]で、2行目の第3列目の要素を指します。
お礼コメント
akika0215

お礼率 83% (88/105)

ご回答ありがとうございました。
教えて頂いたように、ポインタをメンバにすることで
対応できました。
二次元配列のほうも、いけそうです。
本当にありがとうございました。
またよろしくお願いいたします。

※昨日のうちにお礼を書き込みしたのですが、
 うまく送信できていなかったみたいです。
 遅くなってすみません。
投稿日時 - 2001-06-23 14:09:31
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.2
レベル12

ベストアンサー率 75% (398/526)

∇動的確保について(補足要求)
 どのようなコードを書いたらエラーになったのでしょう?

∇二次元配列の確保について
  const int col = 10;
  int (*p)[col];   //「要素をcol個持つint型の配列」への「ポインタp」の宣言
  int row;

  cin >> row;
  p = new int[row][col];

  for (int ir = 0; ir < row; ir++) {
    for (int ic = 0; ic < col; ic++) {
      p[ir][ic] = ir * col + ic;
      cout << p[ir][ic] << ends;
    }
    cout << endl;
  }

  delete [ ] p;

 これではダメですか?
※1次元以外の次元は定数にする必要があります。
(ブラウザ上で見やすくするため、全角spaceを入れています。コピペする場合、注意して下さい。)
補足コメント
akika0215

お礼率 83% (88/105)

こんにちは。ご回答ありがとうございます。

動的確保ですが、クラス宣言の中に
int *p = new int;
を書き込んだだけです。
想像がつかなかったので、ただ単純にやってしまいました。
ポインタをメンバにして参照することで、回避できたのですが、
他にも良い方法がありましたら教えて下さい。
投稿日時 - 2001-06-23 13:55:22


  • 回答No.3
レベル12

ベストアンサー率 75% (398/526)

> 動的確保ですが、クラス宣言の中に
> int *p = new int;
> を書き込んだだけです。

 クラス宣言はあくまで「型情報の定義」であって、インスタンス(強いて言うならクラス型変数)が作成されるわけではありません。
 従ってakika0215さんの記述はエラーとなったわけです。
 (変数領域が確保されないのだから、newの結果を受け取れないのは当然ですよね)

> ポインタをメンバにして参照することで、回避できたのですが、
> 他にも良い方法がありましたら教えて下さい。

 動的に確保するのであれば、ポインタ型メンバを持つのが手っ取り早くてよいと思いますよ。
 ただ、この動的確保を行うのがメインとなるクラスでないのであれば、動的確保とその領域へのアクセスを行うためだけのクラスを書いて、そのオブジェクトをメンバに持つようにするとよいかと思います。
お礼コメント
akika0215

お礼率 83% (88/105)

再度ご回答いただきましてありがとうございます。
とても勉強になりました。
またどうぞよろしくお願いいたします。
投稿日時 - 2001-06-26 00:21:02
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


専門家があなたの悩みに回答!

-PR-

ピックアップ

-PR-
ページ先頭へ