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

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

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

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

Q&A

解決済

3回答

8225閲覧

【C++】vectorの初期化

torimingo

総合スコア122

C++

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

0グッド

0クリップ

投稿2019/04/12 12:03

コンストラクタで、以下のメンバ変数をnullptrで初期化したいのですが、どのように書いたらいいですか?

c++

1 std::vector<class Cat*> cats;

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

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

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

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

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

cateye

2019/04/12 12:39

初期vectorは、要素がありません(初期化するものがない)。分かりますか?
episteme

2019/04/12 14:22

欲するものはCat*の列? それともCatの列?
torimingo

2019/04/12 14:45

>>cateyeさん なるほど、初期化するもの自体がないんですね・・・! >>epistemeさん Catクラスをnewした戻り値(オブジェクトのポインタ)をvectorで管理することを意図したのですが、スマートポインタというものがあることを知って、よくわからなくなってしまいました。
episteme

2019/04/12 14:48

↑ちょっと言ってる意味がわからない。スマートポインタを知らなかったらできたのに? だったら質問してないよね。
guest

回答3

0

こんにちは。

Catへのポインタを要素とするstd::vectorですね。
std::vectorはデフォルトでは要素数が0ですので、当然Catへのポインタは1つもありません。
従って、それを nullptr で初期化することはできないですよ。

それから、C++11以降、new や delete はほとんど書かずに済ませることが出来るようになりました。
これらはリークの元ですから、書かないで済む時は書かないようにするとバグを減らせます。
例えば、std::unique_ptrを使って次のような定義がお薦めです。

C++

1#include <vector> 2#include <memory> 3 : 4typedef std::unique_ptr<Cat> CatPointer; 5std::vector<CatPointer> cats;

投稿2019/04/12 12:48

Chironian

総合スコア23272

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

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

torimingo

2019/04/12 14:38

ご回答ありがとうございました。 unique_ptrの例をありがとうございます。 ユニークポインタの勉強をしたいと思います。
guest

0

ベストアンサー

member変数がcatsってことですか?するとおかしいです。catsはvectorなので。

要素数0のvectorがほしければ

cpp

1struct foo { 2 std::vector<class Cat*> cats; 3 foo() : cats{} {} 4};

でいいですが。

それはそうとstd::vector<class Cat*>ってなんか変です。もしかしてどっかでnewとかdeleteとか書いてませんか?

newやdeleteを書くのは完全に誤っていて、スマートポインタを利用するべきです。

  • std::unique_ptr
  • std::shared_ptr

がありますので目的に合わせて書き換えたほうがいいでしょう。

投稿2019/04/12 12:21

yumetodo

総合スコア5850

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

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

torimingo

2019/04/12 14:36

ご回答ありがとうございました。 最も早く正しい回答を頂けたので、ベストアンサーにさせて頂きました。 スマートポインタの勉強をしていきたいと思います。
episteme

2019/04/12 14:39

nullptrで初期化されてないのに、なんでこれで解決なんよ?
torimingo

2019/04/12 14:46

>>epistemeさん ごめんなさい、なんか、間違えちゃいましたかね・・・? 要素があるからnullptrで初期化しようとしていたんですが、要素がないという回答を頂けたというわけでしたので・・・汗
episteme

2019/04/12 14:58

よーするに 「cats のナカミをからっぽにしたい」だったのかな。だったら初期状態でからっぽだからなんもせんでえぇ、と。
torimingo

2019/04/12 15:03

>>epistemeさん はい、そんな感じです・・・!
guest

0

無理やりやろうとすると・・・

c++

1#include <vector> 2// 3class Cat 4{ 5 int a; 6 int b; 7 public: 8 Cat() : a(0), b(0) {} 9}; 10 11int main(void) 12{ 13 std::vector<Cat *> cats; 14 // 15 Cat *catp = nullptr; 16 for (int i = 0; i < 10; i++) { 17 cats.push_back(catp); 18 } 19 // 20 return 0; 21}

・・・勝手に10個もベクター要素作って意味が有るのか? この後どうするんだろう?

投稿2019/04/12 13:34

cateye

総合スコア6851

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問