あるクラスのインスタンスが動的に複数生成される状態で,一つのインスタンスから,
複数の他インスタンスのメンバ関数(仮に関数A)を呼びたいと考えています.
そこでstaticなインスタンスのリストのようなものを設けようと考えました.
各インスタンスの関数Aへ関数ポインタの配列を定義し,
それによって上記を実現しようと思いました.
しかし,インスタンス生成前にインスタンス名を指定して
(instance_name_.*p)();
という様に呼べるわけもなく,どう動的にインスタンスのリストを保持するかが思いつきません.
説明が下手ですいません.どなたか教えていただけますでしょうか.
よろしくお願いします.
環境
Windows XP, cygwin
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
こんにちは。
初期作成はstaticメンバ関数で行って、その後出来あがったインスタンスのCloneメンバ関数を呼び出して増殖する、と言うのは。
#include<memory>
#include<map>
#include<vector>
#include<string>
#include<iostream>
class II;
typedef std::tr1::shared_ptr<II> IIPtr;
class II
{
typedef IIPtr(*PFNCREATE)();
typedef std::map<std::string, PFNCREATE> IIMap;
static IIMap* _S_pMap;
static const int _S_init;
static void Exit()
{
delete _S_pMap;
}
static IIMap& MapRef()
{
if(_S_pMap == NULL)
_S_pMap = new IIMap();
return *_S_pMap;
}
public:
static bool Append(const std::string& name, PFNCREATE pfn)
{
IIMap& rMap = MapRef();
return rMap.insert(std::make_pair(name, pfn)).second;
}
static IIPtr Create(const std::string& name)
{
IIMap& rMap = MapRef();
IIMap::iterator it = rMap.find(name);
return it != rMap.end() ? (*it->second)() : IIPtr();
}
II(){}
virtual ~II(){}
virtual void Print() = NULL;
virtual IIPtr Clone() const = NULL;
};
II::IIMap* II::_S_pMap = NULL;
const int II::_S_init = ::atexit(&II::Exit);
class AA : public II
{
static const bool _S_init;
static IIPtr Create(){return IIPtr(new AA());}
public:
AA(){}
virtual ~AA(){}
virtual void Print(){std::cout << "AA" << std::endl;}
virtual IIPtr Clone() const { return IIPtr(new AA());}
};
const bool AA::_S_init = II::Append("AA", &AA::Create);
class BB : public II
{
static const bool _S_init;
static IIPtr Create(){return IIPtr(new BB());}
public:
BB(){}
virtual ~BB(){}
virtual void Print(){std::cout << "BB" << std::endl;}
virtual IIPtr Clone() const { return IIPtr(new BB());}
};
const bool BB::_S_init = II::Append("BB", &BB::Create);
int main()
{
std::vector<IIPtr> v;
v.push_back(II::Create("AA"));
v.push_back(II::Create("BB"));
for(std::size_t n = 0; n < v.size(); ++n)
v[n]->Print();
IIPtr pa = v[0]->Clone();
IIPtr pb = v[1]->Clone();
pa->Print();
pb->Print();
return 0;
}
ご返答ありがとうございます.
しかもプログラムまで・・・.
今頑張ってコードを読んでます!!
追加するのも関数化した方が後々分かりやすいかもと思いました.
No.1
- 回答日時:
コンストラクタの中か、インスタンス生成後にリストに追加すれば?
#include <iostream>
#include <string>
#include <iterator>
#include <list>
using namespace std;
class Test;
static list<Test *> test_list;
class Test {
public:
Test(char *str) {
this->str = string(str);
test_list.push_back(this);
}
void a() {
cout << str << endl;
}
private:
string str;
};
int main(void)
{
Test test1("ABC");
Test test2("DEF");
Test *test_ptr;
list<Test *>::iterator it = test_list.begin();
while(it != test_list.end()) {
test_ptr = *it;
test_ptr->a();
it++;
}
return 0;
}
ご返答ありがとうございます!
ポインタの配列とかにしないで,listを使えばよかったんですね.
C++に疎く,listやらmapやらあるのを知りませんでした・・・.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- その他(SNS・コミュニケーションサービス) 大至急お助け下さい。マストドンの或るインスタンスに登録したいのですが、ユーザー名で半角英数とアンダー 1 2023/08/25 10:33
- MySQL AWSのRDSを無料枠で使用しておりますが、2日前にDBインスタンスを作成し、現在確認したらDBイン 1 2022/07/19 23:49
- Java 複数TBLのオブジェクトを1つの変数(オブジェクト)でまとめて管理したい 1 2022/12/17 00:12
- Java インスタンス ダウンキャストについて以下の解釈であっているか教えて欲しいです。 サブクラスをスーパー 1 2022/03/27 18:53
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/05/21 02:41
- Excel(エクセル) 別インスタンスのエクセルを制御したい 1 2023/05/10 02:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数名の付け方
-
private static という変数の修飾
-
インスタンス参照でアクセスで...
-
C# インスタンスの破棄
-
複数の変数を宣言する時、同時...
-
C#において、同じインスタンス...
-
VB.NET getとsetの概念がわかり...
-
他のファイルの変数参照
-
生成したインスタンスを削除す...
-
非staticフィールドを参照でき...
-
VB.netで標準モジュールからフ...
-
変数の参照でエラーが出てしま...
-
ファイル読み込み/書き込み速度...
-
VB.NET Newしたものを変数に代...
-
フィールドでのnewとコンストラ...
-
フォームの存在をチェックする方法
-
整数の引数に列挙を使ったとき
-
インスタンスを同じ名前で作成...
-
文字列を日付に変換でParseExce...
-
SerialPort処理でInvokeメソッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
複数の変数を宣言する時、同時...
-
private static という変数の修飾
-
VB.NET getとsetの概念がわかり...
-
C#において、同じインスタンス...
-
生成したインスタンスを削除す...
-
C# インスタンスの破棄
-
newしないインスタンス?実体化...
-
SQLを連続発行する時の正しい(?...
-
「インスタンス」の意味をわか...
-
文字列を日付に変換でParseExce...
-
変数の参照でエラーが出てしま...
-
フォームの存在をチェックする方法
-
javaのクラスの作り方、エラー...
-
オブジェクト参照がオブジェク...
-
String a = "a"; と String b =...
-
エクセル(複数インスタンス)...
-
C#「オブジェクト参照が必要で...
-
他のファイルの変数参照
おすすめ情報