Kann verhindert werden, dass eine Klasse im RAII-Stil "anonym" instanziiert wird?

7

Angenommen, ich habe eine RAII-style C ++ - Klasse:

%Vor%

... wie in meinem Code zu verwenden:

%Vor%

... Ziel ist es, in einen Zustand zu kommen, Dinge zu tun und dann diesen Zustand zu verlassen, wenn ich diesen Bereich verlasse. Gibt es eine Möglichkeit, diesen Tippfehler nicht zu kompilieren (oder zu warnen, oder sich irgendwie zu beschweren, damit der Fehler bemerkt werden kann)?

%Vor%

Mir ist nichts in C ++ selbst bekannt, das ich verwenden könnte, um dies zu verhindern, aber das bedeutet nicht, dass es nicht existiert. Wenn in C ++ nichts vorhanden ist, sind Compiler-spezifische Erweiterungen akzeptabel. Ich interessiere mich hauptsächlich für alles, was auf GCC und MSVC abzielt (ein Icc-Tag, Ideen für andere Compiler sind willkommen, aber weniger wahrscheinlich, dass sie nützlich sind), also wären Hacks für alle nützlich (abstrahiert in geeignete # ifdef-Makrodefinitionen). .

    
Jeff Walden 22.09.2009, 23:18
quelle

4 Antworten

3

Ich musste tatsächlich meine Lösung in vielerlei Hinsicht von der Variante, die Waldo gepostet hatte, optimieren Was ich schließlich bekam, ist eine Makroversion von:

%Vor%     
David Baron 24.09.2009, 23:00
quelle
9

Ich bin nicht sicher, ob etwas zur Kompilierzeit erledigt werden kann. Für eine Laufzeitprüfung könnten Sie dies tun:

%Vor%

Was erfordert, dass der Client schreibt:

%Vor%

und es gibt keine Möglichkeit, dasselbe für ein temporäres zu tun, ohne es an einen Bezeichner zu binden (an diesem Punkt unterscheidet es sich nicht von einer automatischen Variable).

    
Pavel Minaev 22.09.2009 23:35
quelle
6

SaveMatrix save(); definiert auch kein Objekt. Es erklärt eine Funktion.

Es gibt sehr wenig, was Sie tun können, um andere (oder sich selbst, FTM) daran zu hindern, etwas anderes zu tun, als sie wollten. Das einzige, woran ich denken kann, ist nicht den Code selbst zu schreiben, sondern stattdessen ein Makro zu schreiben.

%Vor%

Das ist jedoch ziemlich hässlich. OTOH, es fängt den Fehler zur Kompilierzeit.

    
sbi 22.09.2009 23:31
quelle
1

Die Klasse kann niemals feststellen, ob sie als temporäre Instanz (SaveMatrix ()) oder als Variable instanziiert wurde (SaveMatrix save;). Ich denke, der beste Weg, den Programmierer ohne Stapel- oder Makro-Hacks zu stoppen, besteht darin, nach der Konstruktion einen Aufruf der Member-Funktion zu erzwingen, zB:

%Vor%

Das funktioniert dann wie folgt:

%Vor%     
AshleysBrain 23.09.2009 00:25
quelle

Tags und Links