OOP(オブジェクト指向プログラミング)に関する質問 - ページ 8

 
C-4:
Typeid()は残念ながら存在せず、静的識別におけるテンプレートの強さ。異なるタスクは異なる方法で解決され、ある方法が悪く、他の方法が良いというのは、煽るような決めつけです。

動的な識別が必要なケースがあったんです。どのソリューションも、ユニバーサルタイプ以外は非常に面倒なものでした。ユニバーサルタイプを実装したクラスによって作られる。

でも、トラブルにも見舞われた。VS 2012からSTL(文字列)の何かが変わり、それ以降、コンパイルできなくなりました。まだ整理していない。

 
Pavlick:

へえ、道しるべじゃなくて、棒読みで笑うんだ。


私の投稿の2番目のリンクの ページには、こう書かれています。

MQL4では、複雑なタイプのオブジェクトを動的に作成することができます。これはnew 演算子を 用いて行われ、作成されたオブジェクトのディスクリプタを返します。

ディスクリプタのサイズは8バイト である。構文的には、MQL4のオブジェクトディスクリプタはC++のポインタに似ています。

MyObject* hobject= new MyObject();

繰り返しになるが、C++とは 異なり、 上記の例の hobject 変数は、メモリへのポインタではなくオブジェクト記述子 である。


 
EverAlex:

私の投稿の2番目のリンクの ページには、こう書かれています。

MQL4では、複雑なタイプのオブジェクトを動的に作成することができます。これはnew 演算子を 用いて行われ、作成されたオブジェクトのディスクリプタを返します。

ディスクリプタのサイズは8バイト である。構文的には、MQL4のオブジェクトディスクリプタはC++のポインタに似ています。

MyObject* hobject= new MyObject();

繰り返しになるが、C++とは 異なり、 上記の例の hobject 変数は、メモリへのポインタではなくオブジェクト記述子 である。

同志mql5が ここで状況を明らかにしたhttps://www.mql5.com/ru/forum/150943/page6#950107 .知らず知らずのうちに大袈裟になっていたのです。
 

クラスの実装ファイルとインターフェイスファイルの分離について、昨日までにテクニカルサポートに質問しました。そして、答えを得た。

В MQL нет файла проекта, фактически им выступает mq4 файл, а программа обязана иметь точки входа (при их отсутствии выдаётся ошибка "event handling function not found"). Поэтому при разделении интерфейса от реализации класса, файлом-реализации и интерфейса должны быть mqh файлы.

要するに、本質的に論理的な選択肢ではないということです。結局、クラスの実装が書かれたファイルは、クライアントから保護するために、実装ファイルになっています。また、どちらもオープンな形式、つまり.mqh 形式であれば、何のためにこんなことをする必要があるのでしょうか。

 
hoz:

クラスの実装ファイルとインターフェイスファイルの分離について、昨日までにテクニカルサポートに質問しました。そして、答えを得た。

要するに、本質的に論理的な選択肢ではないということです。結局、クラスの実装が書かれたファイルは、クライアントから保護するために、実装ファイルになっています。また、どちらもオープンな形式、つまり.mqh 形式であれば、まったく問題ないのでは?

宣言と実装を切り離すことはしない。すべてヘッダーファイルに書いています。この方がずっと便利です。2つのファイルではなく、1つのファイルを管理する必要があるのです。1つのクラスに3つのメソッドしかなければ嬉しいですね。しかし、100人いたらどうでしょう?2つのファイルを比較するのは疲れるでしょう。片方で書いて、もう片方で忘れてしまう...。

ファイルを分割する必要があるのは、たった1つのケースだけです。それは、2つ以上のクラスが互いに参照し合う場合です。このような解決策は避けるべきです。これはC++でも同じです。MQLでどうすればいいのかわからない。

 

教科書の 中で、特にここに書かれているのはコードです。

//+------------------------------------------------------------------+
//| Класс, реализующий элемент списка                                |
//+------------------------------------------------------------------+
class CItem
  {
   int               m_id;
   string            m_comment;
   CItem*            m_next;
public:
                     CItem() { m_id=0; m_comment=NULL; m_next=NULL; }
                    ~CItem() { Print("Destructor of ",m_id,
                                     (CheckPointer(GetPointer(this))==POINTER_DYNAMIC)?
                                     "dynamic":"non-dynamic"); }
   void              Initialize(int id,string comm) { m_id=id; m_comment=comm; }
   void              PrintMe() { Print(__FUNCTION__,":",m_id,m_comment); }
   int               Identifier() { return(m_id); }
   CItem*            Next() {return(m_next); }
   void              Next(CItem *item) { m_next=item; }
  };
//+------------------------------------------------------------------+
//| Простейший класс списка                                          |
//+------------------------------------------------------------------+
class CMyList
  {
   CItem*            m_items;
public:
                     CMyList() { m_items=NULL; }
                    ~CMyList() { Destroy(); }
    bool             InsertToBegin(CItem* item);
    void             Destroy();
  };

以下のフィールドが利用可能です。

void              Next(CItem *item) { m_next=item; }

 bool             InsertToBegin(CItem* item);
なぜ、片方は右で、もう片方は なのでしょうか?
 
hoz:

教科書の 中で、特にここに書かれているのはコードです。

こんな分野もあるんですね。

なぜ * 記号は一方では右に、他方では左に あるのですか?

そう書いてある。そんなことはどうでもいいんです。

私自身は、型の右隣のポインタ(int*)と、その左隣の変数をデリファレンスするとき(*pnVal)に「*」演算子を書いています。

 
Zhunko:

そう書いてあるんです。そんなことはどうでもいいんです。

私自身は、"*"演算子は、ポインタの右隣の型(int*)と、デリファレンス時には左隣の変数(*pnVal)を表すように書いています。

そう思っていました。おそらく、不注意なプログラマーがサンプルを書いたのでしょう。

そこには、他にも不思議なことがある。

 CItem*            m_next;

CItem クラスにオブジェクトディスクリプタ m_nextを 割り当てるということでしょうか。

 
hoz:

教科書の 中で、特にここに書かれているのはコードです。

以下のフィールドが利用可能です。

なぜ、片方は右で、もう片方は なのでしょうか?

左でも右でもなく、その間にある。
 
hoz:

そう思ったんです。不注意なプログラマーが例を書いてしまったのでしょう。

そこには、他にも不思議なことがある。

CItem クラスにオブジェクトディスクリプタm_nextが割り当てられて いるということでしょうか?


つまり、new演算子で インスタンスを生成する必要がある。