Forum: PC-Programmierung c++ static class R oder const class R ?


von EC (Gast)


Lesenswert?

Hallo zusammen,

ich darf in c++ so etwas schreiben:

Datei R.h

static class R
{
 public:
 u.s.w
}

oder

const class R
{
 public:
 u.s.w
}

was hat static oder const !!!vor!!! der Klassen Deklaration für 
Auswirkungen?
Ich finde hierzu nichts, vielleicht weiß jemand auf die schnelle was der 
Standard dazu sagt?

Danke Gruß EC

von Mikro 7. (mikro77)


Lesenswert?

Welche C Version / Compiler ist das denn? Ich kenne das zumindest nicht.

Was ich kenne ist:
1
const class Foo { } foo ;
2
static class Foo { } foo ;
Dabei beziehen sich const/static auf die Instanz, nicht auf die 
Klassendefinition.

: Bearbeitet durch User
von nicht"Gast" (Gast)


Lesenswert?

S. J. schrieb:
> const class Foo { } foo ;

das zumindest kracht dann, wenn du versuchst eine Methode von Foo 
aufzurufen. Die will dann nämlich ein const this als ersten parameter 
haben und übergeben wird nur this.

static sollte die Sichtbarkeit der Klasse auf die Datei beschränken. Das 
const ist IMHO Blödsinn.

von EC (Gast)


Lesenswert?

S. J. schrieb:
> Was ich kenne ist:const class Foo { } foo ;
> static class Foo { } foo ;

Das kenne ich auch.....

Beim Visual Studio2013 geht es, ich glaube das kommt von C11 oder C14 
Standard?

Bei C# darf ich ja (oder muss) man ja public static class bei static 
Methoden schreiben....

von EC (Gast)


Lesenswert?

nicht"Gast" schrieb:
> static sollte die Sichtbarkeit der Klasse auf die Datei beschränken.

Das würde ich auch so sehen, aber müsste const class R kein Fehler 
geben?

von nicht"Gast" (Gast)


Lesenswert?

Zu
1
const struct foo{
2
  void bar(){    
3
  }
4
}bar;
5
6
int _tmain(int argc, _TCHAR* argv[])
7
{
8
  bar.bar();
9
  return 0;
10
}

sagt beim VS2013 beim compilieren:

Error  1  error C2662: 'void foo::bar(void)' : cannot convert 'this' 
pointer from 'const foo' to 'foo &'

und das klingt erst mal logisch.

Wenn man bar.bar() nicht aufruft, gibts auch nichts zu meckern.

von Mikro 7. (mikro77)


Lesenswert?

nicht"Gast" schrieb:
> S. J. schrieb:
>> const class Foo { } foo ;
>
> das zumindest kracht dann, wenn du versuchst eine Methode von Foo
> aufzurufen. Die will dann nämlich ein const this als ersten parameter
> haben und übergeben wird nur this.

Ich bin mir nicht sicher was du meinst. Vielleicht möchtest du das 
umformulieren? ;-)

Bezeichnen wir tatsächlich mal den Pointer auf die Instanz als den 
ersten "Parameter" einer Methode, dann muss der sicherlich const in 
diesem Fall sein. Und das funktioniert grundsätzlich auch wunderbar mit 
const Methoden.

Edit: Kleine Hilfestellung zur const Methode:
1
void bar() const {}

: Bearbeitet durch User
von EC (Gast)


Lesenswert?

nicht"Gast" schrieb:
> Error  1  error C2662: 'void foo::bar(void)' : cannot convert 'this'
> pointer from 'const foo' to 'foo &'

das macht mein Visual Studio 2013 auch :-)

const class R : u.s.w gibt es keinen Fehler !!!

von nicht"Gast" (Gast)


Lesenswert?

S. J. schrieb:
> Ich bin mir nicht sicher was du meinst. Vielleicht möchtest du das
> umformulieren? ;-)

Siehe ein Beitrag später :) Wenn ich mir das so noch mal durchlese. Wer 
hat denn diesen wirren Kram geschrieben. Ich was das nicht ;).

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Hallo Fremder,

EC schrieb:
> ich darf in c++ so etwas schreiben:

Mein Compiler sagt, dass ich das nicht darf. Warum darfst Du das? ;-)

Wenn neben dem Typen auch noch ein Objekt definiert wird, dann würde das 
Sinn ergeben (und natürlich kann man Funktionen auf Konstanten aufrufen, 
aber eben nur die, die einen const-Qualifier haben).

mfg Torsten

von EC (Gast)


Lesenswert?

Ok ich darf auch jetzt auch:

const static const  const const class R

schreiben ich glaube das hier bei meinem Compiler was nicht stimmt :-)

Wir belassen es dabei "dass ich das nicht darf" und jetzt ist Freitag 
:-)

schönes Wochenende

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

EC schrieb:
> Ok ich darf auch jetzt auch:
>
> const static const  const const class R

dann darfst Du bestimmt auch:
1
const static volatile class R{};

> schönes Wochenende

Danke, Dir auch! ;-)

von EC (Gast)


Lesenswert?

Torsten R. schrieb:
> const static volatile class R{};

Ja, darf ich :-) oh man ?!?!??!

von Rolf M. (rmagnus)


Lesenswert?

EC schrieb:
> Torsten R. schrieb:
>> const static volatile class R{};
>
> Ja, darf ich :-) oh man ?!?!??!

Schreiben darf ich das auch. Ich sollte nur nicht erwarten, daß der 
Compiler auch was damit anfangen kann.

nicht"Gast" schrieb:
> Wenn ich mir das so noch mal durchlese. Wer hat denn diesen wirren Kram
> geschrieben. Ich was das nicht ;).

Das sag ich mir auch immer, wenn ich mir meinen Code von vor 5 Jahren 
anschaue.

von Bert3 (Gast)


Lesenswert?

1
const struct foo_t
2
{
3
  int x;
4
  void bar(){ x = 10; }    
5
};

gcc 5.2 kompiliert das nicht:
error: qualifiers can only be specified for objects and functions

clang 3.7 liefert warnungen
!!warning: 'const' is not permitted on a declaration of a type 
[-Wmissing-declarations]

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.