C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

オブジェクトを動的にのみ割り当てることができるC++クラスを作成するにはどうすればよいですか?


この問題では、動的メモリ割り当てによってのみオブジェクトを作成でき、直接オブジェクトを作成できない1つのクラスを作成する方法を説明します。

アイデアは単純です。そのクラスのプライベートデストラクタを作成する必要があります。デストラクタがプライベートの場合、コンパイラは、動的に割り当てられていないオブジェクトに対してコンパイラエラーを生成します。これは、オブジェクトが使用できなくなったら、コンパイラがそれらをスタックセグメントから削除する必要があるためです。動的に割り当てられたオブジェクトの場合、プログラマーはオブジェクトの削除を担当しますが、コンパイラーはその責任を負わないため、オブジェクトを動的に作成できます。

メモリリークを回避するために、クラスのユーザーがオブジェクトを破棄するために呼び出すことができるフレンド関数を使用します。

理解を深めるために、次の実装を見てみましょう-

#include<iostream>
using namespace std;
class NoDirectObjClass {
   private:
      ~NoDirectObjClass() {
         cout << "Destroyng NoDirectObjClass object" << endl;
      }
   public:
      NoDirectObjClass() {
         cout << "Creating object" << endl;
      }
   friend void friend_destructor(NoDirectObjClass* );
};
void friend_destructor(NoDirectObjClass* p) {
   delete p;
   cout << "Destroyng object using friend" << endl;
}
int main(){
   NoDirectObjClass *p = new NoDirectObjClass;
   friend_destructor(p);
}

出力

Creating object
Destroyng NoDirectObjClass object
Destroyng object using friend

動的メモリ割り当てを使用せずにオブジェクトを直接作成しようとすると、次のように出力が生成されます-

例(C ++)

#include<iostream>
using namespace std;
class NoDirectObjClass {
   private:
      ~NoDirectObjClass() {
         cout << "Destroyng NoDirectObjClass object" << endl;
      }
   public:
      NoDirectObjClass() {
         cout << "Creating object" << endl;
      }
   friend void friend_destructor(NoDirectObjClass* );
};
void friend_destructor(NoDirectObjClass* p) {
   delete p;
   cout << "Destroyng object using friend" << endl;
}
int main(){
   NoDirectObjClass t1;
}

出力

main.cpp: In function ‘int main()’:
main.cpp:22:22: error: ‘NoDirectObjClass::~NoDirectObjClass()’ is private
within this context
   NoDirectObjClass t1;
                     ^~
main.cpp:6:9: note: declared private here
         ~NoDirectObjClass() {
         ^

  1. カスタムオブジェクトをパーセル可能にするにはどうすればよいですか?

    この例は、カスタムオブジェクトをパーセル可能にする方法を示しています ステップ1 − Android Studioで新しいプロジェクトを作成し、[ファイル]⇒[新しいプロジェクト]に移動して、新しいプロジェクトを作成するために必要なすべての詳細を入力します。 ステップ2 −次のコードをres / layout/activity_main.xmlに追加します。 <?xml version = "1.0" encoding = "utf-8"?> <LinearLayout xmlns:android = "https://sc

  2. JTextFieldがJavaで数値のみを受け入れるようにするにはどうすればよいですか?

    デフォルトでは、 JTextField 数字を許可できます 、文字 、および特別 キャラクター 。 JTextFieldに入力されたユーザー入力の検証 特に入力文字列をintなどの数値に変換する必要がある場合は、難しい場合があります。 次の例では、 JTextField 数値のみを入力できます 。 例 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class JTextFieldValidation extends JFrame {    JTextField tf;