こんな事ができるか分かりませんが、あるクラスオブジェクトを作成するのに
newでしか作成できなくする方法ってありますか?
つまり
class A{
//何かしらのコード;
};
int main()
{
A *p = new A; // <- OK
A ob; // <-不可能にしたい
}
てなわけなんですが。
というのはWindowをクラスオブジェクトとし、WM_DESTROYでそのオブジェクトをdelete
したいのですが、値型でクラスを実体化してしまうとマズイのです・・・
何かいい方法ありませんか?
あるいはオブジェクトをnewで作成したか否かを判定できれば、それでもいのですが。
class A
{
public:
static A create() { return new A(); }
private:
A() { }
};
こんな風にしておくと、A::create()以外では生成できなくなります。
間違い
> static A create() { return new A(); }
static A* create() { return new A(); }
なるほど。
コンストラクタをプライベートにしてCreate以外では実体化できないようにしてる
わけですね。
ですが、そうなると確かにCreate()をstaticにしないとダメですね。
これだとthisポインタ無いため、クラスメンバーにアクセスできませんよね。
これはちょっと困っちゃうんですが・・・(クラスメンバに値を入れたい為)
このコード見たとき「なるほど!」って思わず唸っちゃったんですけどね。
A::Set**()ってメンバ関数作っていちいちメンバ変数に代入していくしかないのかなぁ。
んなことはないです。 this はきっちりありますよ。
全メンバ関数を private にするのではないのですが...
あ、コンストラクタを定義すればいいのか。
ボケかましてしまいましたね。
すみません。
もう[解決]印がついているので余計なお世話かも知れませんが...
「newでしか作成できなくする」のを徹底するなら,コピーコンストラクタもプライベー
トで定義した方が良いですね.
ついでにコピーオブジェクト(クローン)もnewで作れるようにしてみたり...
class A
{
public:
static A* create(){ return new A(); }
A* clone() const { return new A( *this ); } // おまけ
private:
A(){}
A( const A& other ){}
};
int main()
{
A* p1 = A::create();
A* p2 = p1->clone();
delete p1;
delete p2;
}
はい。
コピーコンストラクタもoperator=もプライベートにしています。
ウィンドウオブジェクトですのでコピー不可でOKなのです。
クローンは今のクラスでは必要ないですね。
でも参考になりました、ありがとうございます。