来自一个 "傻瓜 "的问题 - 页 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:

你去吧,加号的人已经离开了:)。谢谢你。
 
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是王道!"

 

你也可以这样去做。

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定义。

要么是一个bug,要么是一个bug。最有可能的是后者,但最好是澄清一下。