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

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

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

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

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

Q&A

解決済

3回答

3227閲覧

クラスのインスタンスを格納する配列、コンテナ

tuyudaku

総合スコア75

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

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

0グッド

0クリップ

投稿2019/06/17 08:56

別々のクラスから生成した複数のインスタンス、またはそのポインタ
それらをVectorなどのコンテナクラスなどに格納したいのですが
その様な方法はありますでしょうか?

現在、Qtを使って複数のスレッドを立てて動作するプログラムを作成中です

C++

1class A { A(); }; 2class B { B(); }; 3 4example() 5{ 6 A* instance_a = new A(); 7 B* instance_b = new B(); 8 QThread thread_a = new QThread(); 9 QThread thread_b = new QThread(); 10 11 instance_a->moveToThread(thread_a); 12 instance_b->moveToThread(thread_b); 13 14 connect(thread_a, SIGNAL(finished()), instance_a, SLOT(deleteLater()))); 15 connect(thread_b, SIGNAL(finished()), instance_b, SLOT(deleteLater()))); 16 17181920}

上記のように
複数のインスタンスに対して、同じような処理をするのですが
これ、ループでまわせないかな...と思った次第です。

例えばこのように...

C++

1class A { A(); }; 2class B { B(); }; 3 4example() 5{ 6 std::Vector<??> instances; 7 8 instances.push_back(new A()); 9 instances.push_back(new B()); 10 11 12131415}

違うクラスのインスタンスたちを1つのコンテナにまとめられるようなやり方はありますでしょうか?

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

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

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

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

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

guest

回答3

0

共通の基底クラスを継承すれば可能です。

c++

1#include <iostream> 2#include <vector> 3using namespace std; 4 5class base 6{ 7public: 8 base() {} 9 virtual void disp() = 0; 10}; 11class A : public base 12{ 13 bool bA; 14public: 15 A() : bA(true) {} 16 bool IsA() {return bA;} 17 void disp() 18 { 19 if (bA) 20 cout << "I am class A." << endl; 21 } 22}; 23class B : public base 24{ 25 bool bA; 26public: 27 B() : bA(false) {} 28 bool IsA() {return bA;} 29 void disp() 30 { 31 if (!bA) 32 cout << "I am class B." << endl; 33 } 34}; 35 36 37int main(void){ 38 // Your code here! 39 vector<base*> vec; 40 vec.push_back((base*)new A()); 41 vec.push_back((base*)new B()); 42 43 for (auto& c : vec){ 44 c->disp(); 45 } 46 for (auto&c : vec){ 47 delete c; 48 } 49} 50

出力結果

I am class A. I am class B.

投稿2019/06/17 09:16

PineMatsu

総合スコア3579

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

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

tuyudaku

2019/06/17 09:42

>共通の基底クラスを継承すれば可能です。 サンプルのコードまで丁寧にありがとうございます! 基底クラス使えば...?いや、そんな簡単に行くか? とか思っていましたが サンプルのおかげでとてもイメージしやすかったです! 回答ありがとうございました!
guest

0

ベストアンサー

A も B も QObject のサブクラスなので、QObject * 型のコンテナにするのがいいのではないでしょうか?

Qt でマルチスレッドをする際は様々な選択肢がありますので、QThread を使うのがベストなのかについても検討してみるといいかと思います。
https://qiita.com/hermit4/items/f4f03a4533e8c332241b

投稿2019/06/17 09:13

tasuku.

総合スコア347

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

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

tuyudaku

2019/06/17 09:40

>QObject * 型のコンテナにするのがいいのではないでしょうか? はっ!?と思いました。 確かに...それなら他の方にも回答していただいた 基底クラスを用いた方法がそのまま使えます というか、サンプルにはQObjectは書いていなくて ヒントになるのはmoveToThreadだけという糞みたいな質問文なのに よくそこに気付きましたね...すごいです! 回答ありがとうございました!
tuyudaku

2019/06/17 09:43

すみません、追加で >QThread を使うのがベストなのかについても検討してみるといいかと思います。 一応、シグナルを使ったデータのやり取りを考えているので 今のところQThreadで行こうと思っています 参考のURLもありがとうございました!
guest

0

AB が共通の抽象クラスを基底に持つように継承関係を作るのが一般的ですが、なるべく継承関係を作らずに処理したいのであれば C++17 から導入された std::variant を使うこともできます。

投稿2019/06/17 09:11

SaitoAtsushi

総合スコア5444

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

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

tuyudaku

2019/06/17 09:36

>C++17 から導入された std::variant を使うこともできます。 そんな便利なものが...!! ありがとうございます、検討させていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問