PLOです。アプリケーションの問題 - ページ 15

 

デフォルトのコンストラクタは、そのクラスのオブジェクトの配列を初期化するという特定の目的を持っています。 すべてのパラメータがデフォルトに設定されたコンストラクタは デフォルトのコンピュータではありません

誤字を赤字で強調しました。

ところで、このようなコンストラクタは、なぜデフォルトではコンストラクタにならないのでしょうか?もう一つの松葉杖?

 
TheXpert:

デフォルトのコンストラクタは、そのクラスのオブジェクトの配列を初期化するという特定の目的を持っています。 すべてのパラメータがデフォルトに設定されたコンストラクタは デフォルトのコンピュータとは言えません こちら

面白いタイプミスですね、ありがとうございます。修正しました。
 
Yedelkin:

"無効なポインタへのアクセス" =="無効なポインタへのアクセスを試みている"?

多くの場合、手際が悪いか、ポインターを扱う基本原則を理解していないことの直接的な表れです。

このような場合、クラスの使用法が十分に文書化されていないことの表れであることが少なくありません。

 
TheXpert:

ところで、なぜこのコンストラクタはデフォルトのコンストラクタではないのでしょうか?もう一つの松葉杖?

全く逆です。松葉杖はデフォルトのパラメーターの存在で、これは見つけにくいバグの元となるからだ。ここが厳しいところです。

パラメータ付きのコンストラクタを書くと、パラメータなしのコンストラクタも書けるようになります。また、デフォルトのコンストラクタがある場合、すべてのデフォルトのパラメータを持つパラメトリックコンストラクタを書くことはできません。

 
stringo:

デフォルトのパラメータを持つことは、バグを捕らえにくい原因になってしまうので、ひつようなのです。

そうですね......なんとなくですが、そういうシチュエーションが思い浮かばないんです。

また、デフォルトのコンストラクタがある場合、すべてのデフォルトパラメータを持つパラメトリックコンストラクタは書けません。

ああ、それなら正常で論理的ですね。そうでなければ、何か理解しがたい曖昧さがあったのです。
 

コンテキスト解決操作( :: )について 読みました。関係ない2つのクラスで使ってみることにしました。

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class C_B;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class C_A
  {
public:
   C_B              *pointer;

                     C_A(void) {};
                    ~C_A(void) {};
   void funcA(int i) { Print("funcA(",i,")=",i); }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class C_B
  {
public:
                     C_B(void) {};
                    ~C_B(void) {};
   void funcB(int j)
     {
      Print("funcB(",j,")=",j);
      C_A::funcA(j);
     }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   C_A object;
   object.pointer=new C_B();
   object.pointer.funcB(5);
   delete object.pointer;
  }

コンパイラはC_A::funcA(j)の行でエラーを出します。コメントアウトすると、うまくいくようです。私の間違いは何ですか?

 
Yedelkin:

コンテキスト解決操作( :: )について 読みました。関係ない2つのクラスで使ってみることにしました。

C_A::funcA(j) の行でコンパイラがエラーを発生させました。コメントアウトすると、うまくいくようです。私の間違いは何ですか?

あなたの場合、クラスC_Aのコンテキストは、クラスC_Bから利用できません。

場合にのみ正しい。

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class C_B : public C_A
  {
public:
                     C_B(void) {};
                    ~C_B(void) {};
   void funcB(int j)
     {
      Print("funcB(",j,")=",j);
      C_A::funcA(j);
     }
  };

でも、それなら可能です。


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class C_B : public C_A
  {
public:
                     C_B(void) {};
                    ~C_B(void) {};
   void funcB(int j)
     {
      Print("funcB(",j,")=",j);
      funcA(j);
     }
  };


一般に、このような呼び出しはオーバーロードされたメソッドに 使用されます。


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class C_B;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class C_A
  {
public:
   C_B              *pointer;

                     C_A(void) {};
                    ~C_A(void) {};
   void func(int i) { Print("C_A::func(",i,")=",i); }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class C_B : public C_A
  {
public:
                     C_B(void) {};
                    ~C_B(void) {};
   void func(int j)
     {
      Print("C_B::func(",j,")=",j);
      C_A::func(j);
     }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   C_A object;
   object.pointer=new C_B();
   object.pointer.func(5);
   delete object.pointer;
  }

おおよそこのような感じです。

 
uncleVic:

あなたの場合、クラスC_Aのコンテキストは、クラスC_Bから利用できません。

ありがとうございます。つまり、コンテキスト解決操作は 継承されなくても適用できるというのは私の勘違いでした。
 

あるクラスから別のクラスへメンバ値を「参照渡し」し、ディスクリプタを使おうとしています。どちらのオプションも有効なようです。ここでは、最もシンプルな方式を紹介します。

class B
  {
private:
   double            d1;
public:
                     B(double &d) {  d1=d; Print("class B, double d1=",d1);  };
                    ~B(void){};
  };
class A
  {
public:
   double            double_var;
   A                *pointerA;
 

                     A(void) : double_var(1.234567),pointerA(NULL) { SetPointer(); };
                    ~A(void) {if(CheckPointer(pointerA)==POINTER_DYNAMIC) delete pointerA; };
private:
   void SetPointer(void) { pointerA=GetPointer(this); }
  };
class C 
  {
public:
   A                *pointerA_C;
public:
                     C(void) : pointerA_C(NULL) {};
                    ~C(void) {if(CheckPointer(pointerA_C)==POINTER_DYNAMIC) delete pointerA_C;};
   void Printer() {if(CheckPointer(pointerA_C)!=POINTER_INVALID) Print("class C, double =",pointerA_C.double_var); };
  };
void OnStart()
  {
   A objA;
//---передаём значение double-переменной по ссылке
   B objB(objA.double_var);
//---передаём значение double-переменной через описатель
   C objC;
   objC.pointerA_C=objA.pointerA;
   objC.Printer();
  }

この2つの方法のうち、どちらが早く効果が出るのでしょうか?どちらがより好ましいですか?

 
Yedelkin:

あるクラスから別のクラスへメンバ値を「参照渡し」し、ディスクリプタを使おうとしています。どちらのバリエーションも有効なようです。ここでは、最もシンプルな方式を紹介します。

この2つの方法のうち、どちらが早く効果が出るのでしょうか?どちらがより好ましいですか?

質問は本当に重いのか・間違っているのか?

私は長い間、最初の方法(「リンクをたどる」)を使っていましたが、記述子の考え方はとても気に入っています。ただ、そのためにすべてのクラスを書き換える価値があるかどうかはわかりません。