Fragen von einem "Dummy" - Seite 139

 
220Volt:
Ja, ich schätze, ich sollte ein Pluszeichen setzen ))
Ein gutes Beispiel für die Sinnlosigkeit der "Warum?"-Frage. Vielleicht gibt es andere Fragen? :)
 
MetaDriver:
Ein gutes Beispiel für die Sinnlosigkeit der "Warum?"-Frage, vielleicht gibt es andere Fragen? :)
:) Hier ist ein Gedanke - vielleicht sollte es eine andere Möglichkeit geben, dies in VS zu tun? Oder ist sie nutzlos?
 
220Volt:
:) Ein Gedanke - gibt es eine andere Möglichkeit, dies in VS zu tun? Oder ist sie nutzlos?
Das ist die richtige und nützliche Frage, auf die Ihnen die Experten nun eine aussagekräftige Antwort geben können... :)
 
220Volt:
:) Ich habe eine Idee - vielleicht sollte der VS die Dinge anders angehen?
ja.
 
//--------- 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:
Ja, ja.
Nun, jeder kann es tun... Sie bringen die Referenzvariablen zum Laufen... :) :)
 
MetaDriver:

Na bitte, das Pluszeichen ist weg :). Ich danke Ihnen.
 
sergeev:
Ja.

Übrigens, auch das funktioniert nicht:

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;}
};

Das funktioniert folgendermaßen:

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:
Na bitte, das Plüschtier ist weg :). Ich danke Ihnen.

Nein, nein, nein, nein! Behalten Sie das Plus: "MS ist scheiße, MQ ist König!"

 

Sie können auch so vorgehen:

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;}
Das Wichtigste ist, dass C++-Regeln für die sequentielle Kompilierung ausgelegt sind.
 
220Volt: Es kompiliert in MQL ohne Fehler, in VS wird es nicht kompiliert (der Programmierer sagt dem Programmierer, dass er/sie nicht in der Lage ist, die Klasse ohne Definition zu verwenden). Und warum?

VS hat natürlich recht. Die Deklaration reicht aus, wenn Sie die Implementierung der Funktion fn2 außerhalb der Klasse und nach der Definition von cl2 vornehmen.

Da die Funktion direkt im Textkörper definiert ist, funktioniert eine einfache Deklaration nicht (auch wenn sie per Verweis übergeben wird), da eine cl2-Definition erforderlich ist, damit die Funktion funktioniert.

Entweder ein Bug oder ein Fehler. Höchstwahrscheinlich handelt es sich um Letzteres, aber es ist besser, das zu klären.