Вопросы от "чайника" - страница 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;}

220Volt:
Ну вот, плюсик сорвался :). Спасибо.

Не не не !!  Плюсик оставляем.  "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;}
Главное усвоить суть - правила С++ расчитаны на последовательную компиляцию.
 
220Volt:В MQL компилируется без ошибок, в VS не хочет (говорить что нельзя использывать класс без определения). Почему?

VS ессно права. Объявления будет достаточно, если вынести реализацию функции fn2 за пределы класса и после определения cl2.

А т.к. функция определена прямо в теле, простое объявление не канает (хоть и передача по ссылке), т.к. для работы функции требуется определение cl2.

Или бага, или фича. Скорее второе, но лучше уточнить.

Причина обращения: