new以外でオブジェクトを作成できなくするには? – プログラミング – Home

new以外でオブジェクトを作成できなく...
 
通知
すべてクリア

[解決済] new以外でオブジェクトを作成できなくするには?


SunPac
 SunPac
(@SunPac)
ゲスト
結合: 22年前
投稿: 105
Topic starter  

こんな事ができるか分かりませんが、あるクラスオブジェクトを作成するのに
newでしか作成できなくする方法ってありますか?

つまり
class A{
//何かしらのコード;
};

int main()
{
A *p = new A; // <- OK
A ob; // <-不可能にしたい
}

てなわけなんですが。
というのはWindowをクラスオブジェクトとし、WM_DESTROYでそのオブジェクトをdelete
したいのですが、値型でクラスを実体化してしまうとマズイのです・・・
何かいい方法ありませんか?
あるいはオブジェクトをnewで作成したか否かを判定できれば、それでもいのですが。


引用未解決
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 24年前
投稿: 1421
 

class A
{
public:
static A create() { return new A(); }
private:
A() { }
};

こんな風にしておくと、A::create()以外では生成できなくなります。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 24年前
投稿: 1421
 

間違い
> static A create() { return new A(); }
static A* create() { return new A(); }


返信引用
SunPac
 SunPac
(@SunPac)
ゲスト
結合: 22年前
投稿: 105
Topic starter  

なるほど。
コンストラクタをプライベートにしてCreate以外では実体化できないようにしてる
わけですね。

ですが、そうなると確かにCreate()をstaticにしないとダメですね。
これだとthisポインタ無いため、クラスメンバーにアクセスできませんよね。
これはちょっと困っちゃうんですが・・・(クラスメンバに値を入れたい為)

このコード見たとき「なるほど!」って思わず唸っちゃったんですけどね。
A::Set**()ってメンバ関数作っていちいちメンバ変数に代入していくしかないのかなぁ。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 22年前
投稿: 830
 

んなことはないです。 this はきっちりありますよ。
全メンバ関数を private にするのではないのですが...


返信引用
SunPac
 SunPac
(@SunPac)
ゲスト
結合: 22年前
投稿: 105
Topic starter  

あ、コンストラクタを定義すればいいのか。
ボケかましてしまいましたね。
すみません。


返信引用
iijima
 iijima
(@iijima)
ゲスト
結合: 22年前
投稿: 44
 

もう[解決]印がついているので余計なお世話かも知れませんが...

「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;
}


返信引用
SunPac
 SunPac
(@SunPac)
ゲスト
結合: 22年前
投稿: 105
Topic starter  

はい。
コピーコンストラクタもoperator=もプライベートにしています。
ウィンドウオブジェクトですのでコピー不可でOKなのです。
クローンは今のクラスでは必要ないですね。

でも参考になりました、ありがとうございます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました