"ダミー "からの質問 - ページ 139

 
220Volt:
ええ、プラス記号をつけるべきでしょうね ))
なぜ?」という疑問が無意味であることを示す良い例です。 もしかしたら、他の疑問があるのでは?:)
 
MetaDriver:
なぜ?」という問いの無意味さを示す良い例だ。もしかしたら、他の問いがあるのかもしれない?:)
:)ここで思いついたのですが、もしかしたらVSで何か他の方法があるはずではないでしょうか?それとも無駄なのか?
 
220Volt:
:)一考 - VSで行う他の方法はないのでしょうか?それとも無駄なのか?
これは正しい質問であり、有用な質問です。 これで専門家が有意義な答えを出してくれるでしょう... :)
 
220Volt:
:)思いついたことがあります。VSは違うやり方をしたほうがいいのでは?
はい
 
//--------- C++
class cl2; 

class cl1
{
public:
        int q;
        void fn2(cl2 &t);
};

class cl2
{
public:
        int i;
        void fn(cl1 &w);
};
//-- реализация функций только после полного описания интерфейса - т.е. фиксации размеров классов
//-- теперь компилятор знает сколько именно стека нужно резервировать в функциях под классы
void cl1::fn2(cl2 &t){t.i = 87;}
void cl2::fn(cl1 &w){w.q = 9;}

 
sergeev:
そうですね。
まあ、誰でもできることではあるのですが...。参照変数を機能させるのですね... :):)
 
MetaDriver:

これで、プラス1が消えましたね :).ありがとうございます。
 
sergeev:
はい。

ちなみに、それもうまくいきません。

class cl2; 

class cl1
{
public:
        int q;
        void fn2(cl2 *t){t->i = 87;}
};


class cl2
{
public:
        int i;
        void fn(cl1 *w){w->q = 9;}
};

このような仕組みになっています。

class cl2; 

class cl1
{
public:
        int q;
        void fn2(cl2 *t);


class cl2
{
public:
        int i;
        void fn(cl1 *w);
};

void cl1::fn2(cl2 *t){t->i = 87;}
void cl2::fn(cl1 *w){w->q = 9;}

220Vの 場合。
ほら、ぬいぐるみが取れましたよ :).ありがとうございます。

いやいや、プラスのままでいい。"MSはクソ、MQは王者!"

 

こんな感じでもOKです。

class cl2; 

class cl1
{
public:
        int q;
        void fn2(cl2 *t);//{t->i = 87;} // здесь реализация не прокатит: ещё неизвестен размер и состав класса cl2
};                                    // например, откуда последовательному компилятору знать о члене 'i' ?


class cl2
{
public:
        int i;
        void fn(cl1 *w){w->q = 9;} // размер и состав класса cl1 уже известен на этом этапе. поэтому можно здесь.
};

void cl1::fn2(cl2 *t){t->i = 87;}
//void cl2::fn(cl1 *w){w->q = 9;}
覚えておくべきことは、C++のルールは逐次的に コンパイルされるように設計されていることです。
 
220Volt: MQLではエラーなくコンパイルできるのに、VSではコンパイルできない(プログラマーが定義なしのクラスを使用できないことを伝えている)。なぜ?

もちろんVSは正しい。fn2関数の実装をクラスの外、cl2定義の後に持っていけば、この宣言で十分です。

関数が動作するためにはcl2定義が必要なため、(参照渡しではあるが)単純な宣言では動作しない。

バグかどちらかです。後者である可能性が高いが、はっきりさせておいたほうがよい。