//--------- 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;}
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;}
ええ、プラス記号をつけるべきでしょうね ))
なぜ?」という問いの無意味さを示す良い例だ。もしかしたら、他の問いがあるのかもしれない?:)
:)一考 - VSで行う他の方法はないのでしょうか?それとも無駄なのか?
:)思いついたことがあります。VSは違うやり方をしたほうがいいのでは?
そうですね。
はい。
ちなみに、それもうまくいきません。
このような仕組みになっています。
ほら、ぬいぐるみが取れましたよ :).ありがとうございます。
いやいや、プラスのままでいい。"MSはクソ、MQは王者!"
こんな感じでもOKです。
覚えておくべきことは、C++のルールは逐次的に コンパイルされるように設計されていることです。もちろんVSは正しい。fn2関数の実装をクラスの外、cl2定義の後に持っていけば、この宣言で十分です。
関数が動作するためにはcl2定義が必要なため、(参照渡しではあるが)単純な宣言では動作しない。
バグかどちらかです。後者である可能性が高いが、はっきりさせておいたほうがよい。