Fehler, Irrtümer, Fragen - Seite 2721

 
Koldun Zloy:

Das macht keinen Sinn. Wenn Sie es nicht ändern wollen, müssen Sie nicht gleich eine Konvention aufstellen. Es reicht aus, die Variable privat zu machen.

Es wäre logisch, wenn Sie etwas davon hätten, aber Sie haben sich damit nur selbst ein Problem geschaffen.

const ist eine zusätzliche Kontrolle. Andernfalls bräuchte man diese Richtlinie gar nicht in die Sprache einzuführen.


Das Gute an einem öffentlichen const-Feld ist, dass es READ-zugänglich ist (es kann per Referenz übergeben werden). Eine versehentliche Änderung ist jedoch ausgeschlossen.


const hilft mir sehr beim Schreiben von Programmen. Dies ist das erste Mal, dass ein Problem aufgetreten ist.


Es ist auch hilfreich, this und :: zu verwenden, wenn sie nicht geschrieben werden können.

 
fxsaber:

const ist eine zusätzliche Kontrolle. Andernfalls hätten wir die Einführung dieser Richtlinie in die Sprache ganz vermeiden können.


Ein öffentliches const-Feld ist insofern gut, als es LESBAR ist (es kann per Referenz übergeben werden). Eine versehentliche Änderung ist jedoch ausgeschlossen.


const hilft mir sehr beim Schreiben von Programmen. Dies ist das erste Mal, dass ein Problem aufgetreten ist.


HH Es ist auch hilfreich, this und :: zu verwenden, wenn sie nicht geschrieben werden können.

Machen Sie die Variable privat. Verwenden Sie eine Funktion zum Lesen. const int muss nicht per Referenz übergeben werden.

 
Koldun Zloy:

Machen Sie die Variable privat. Verwenden Sie eine Funktion, um sie zu lesen. const int muss nicht per Referenz übergeben werden.

Sie schlagen vor, const einfach zu ignorieren.

 
fxsaber:

Sie wollen damit sagen, dass der Widerspruch einfach ignoriert wird.

Nein. Aber in diesem speziellen Fall ist sie nicht erforderlich.

 
Mann, Sie erfinden ein Problem aus dem Nichts."Die Mäuse weinten und weinten, aber sie bissen weiter in den Kaktus".
 
fxsaber:

Ich habe experimentiert, im Allgemeinen ist jede Lösung "fehlerhaft", egal wie man sie betrachtet

Wenn es um die Ausführungsgeschwindigkeit und die Kontrolle des Zugriffs auf das Strukturfeld geht, kann man eine hässliche Lösung schreiben, die aber das Problem löst

Ich würde auf statische Methoden in der Struktur ganz verzichten - sie haben keinen Sinn, der Code wird immer noch verwirrend und unlogisch sein

sieht es so aus:

int tmp[] = {1,2,3,99};
struct A
{
private:
   static int count;
public:
   const int a;
   A():a(tmp[count++]) {}
};
static int A::count = 0;
//+------------------------------------------------------------------+
void OnStart()
{
   A a[ArraySize(tmp)];
   for(int i=0;i<ArraySize(a);i++) Print(a[i].a);
}


....da und der Zähler werden ebenfalls nicht benötigt. Vielmehr müssen Sie A[ArraySize(tmp)]; in eine Makro-Substitution einbinden, die ein Array von Strukturen erzeugt und ein temporäres Array tmp löscht

 

Es gibt zwei Programme, die gleichzeitig an der gleichen Datei arbeiten. Das schreibende Programm verwendet die FlagsFILE_READ|FILE_WRITE|FILE_BIN|FILE_SHARE_READ. Derjenige, der liest - FILE_READ|FILE_BIN|FILE_SHARE_WRITE|FILE_SHARE_READ. Obwohl das erste Programm die Datei regelmäßig mit FileFlush speichert, sieht das zweite Programm die Länge der Datei nur, wenn sie geöffnet wird. Ich habe versucht, FileSeek hin und her zu schieben - es hilft nicht.

Frage: Wie bringe ich das Programm, das die Datei liest, dazu, die zu überschreibenden Daten zu übernehmen?

 

Ich fasse zusammen:

struct A {
    const int a; 
    A() {}
};
void OnStart()
{
            A a1; //(1) нормально
    const int a2; //(2) Error: 'a2' - 'const' variable must be initialized
}

Was ist der Unterschied zwischen 1 und 2?

 
A100:

Ich fasse zusammen:

Was ist der Unterschied zwischen 1 und 2?

Ich hatte gehofft, dass es einen eingebauten Mechanismus gibt, um diesen Fall zu initialisieren, aber da ist nichts

struct A {
    const int a[10]; 
    A() {ArrayPrint(a);} //-396985669       32758 -1490812928       32757  2147360768           0 -1681390008         493           0           0

};
//+------------------------------------------------------------------+
void OnStart()
{
  A a1;
}
//+------------------------------------------------------------------+

ZS: Hier sieht der Compiler

void f()
{
   const int x;  //'x' - 'const' variable must be initialized
}
 
Igor Makanu:

Ich hatte gehofft, dass es einen Mechanismus gibt, um diesen Fall zu initialisieren, aber da ist nichts.

ZS: Hier sieht der Compiler

Im Prinzip sollte es einen solchen Fall nicht geben - das Problem sollte bereits auf der Compiler-Ebene (wie in C++) gelöst sein. Und hier ist es irgendwie möglich und als Konsequenz eine Diskussion über mehrere Seiten