Entwickler-Ecke
Off Topic - Protected const?
P4o3n1x - Do 10.06.10 16:06
Titel: Protected const?
Hallo,
ich habe gerade eine kleine Auseinandersetzung mit meinem Compiler, die ich nicht ganz verstehe:
ich habe eine ABC (abstract base class) erstellt, die ich mal
AlgebraicValue genannt habe. Das Interface sieht (grob gekürzt) etwa so aus:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| class AlgebraicValue { protected: const char deftype; public: AlgebraicValue( void ) : deftype( 0 ) { }
virtual AlgebraicValue* foo( AlgebraicValue const& ) = 0; }; |
Soweit ich das erkennen kann, soweit keine Probleme. Nun leite ich eine Klasse
Fraction von
AlgebraicValue ab und möchte meine Konstante
deftype von der ich dachte dass sie durch den Zusatz protected in abgeleiteten Klassen sichtbar sein müsste im Konstruktor von
Fraction setzen:
C#-Quelltext
1: 2: 3: 4: 5:
| Fraction::Fraction( int a = 0, int b = 1 ) : deftype( 1 ) { } |
Ich bekomme beim Kompilieren jedoch die Fehlermeldung:
Quelltext
1:
| class 'Fraction' does not have any field named 'deftype' |
Das ist für mich nicht nachvollziehbar. Ich wäre für jeden der mich hier auf die richtige Fährte locken könnte sehr dankbar!
Moderiert von
Christian S.: Topic aus C# - Die Sprache verschoben am Do 10.06.2010 um 16:56
Christian S. - Do 10.06.10 16:26
Das ist kein C# :gruebel:
fidionael - Do 10.06.10 16:39
Christian S. hat folgendes geschrieben : |
| Das ist kein C# :gruebel: |
Augenscheinlich handelt es sich hier um ein C++-Problem. Zusätzlich zum verfehlten Forum kann ich außerdem keine praktische Relevanz des Problems erkennen - die Konstante soll anscheinend der Identifizierung der Klasse dienen; als "beschützte" Variable ist diese jedoch außerhalb der Klasse (in der man ja sowieso weiß wer man ist) nicht ansprechbar!
bakachan - Do 10.06.10 16:48
Ich würde einfach mal behaupten der Threadersteller hat vergessen Fracction von seiner Basisklasse abzuleiten ^^
P4o3n1x - Do 10.06.10 16:54
Christian S. hat folgendes geschrieben : |
| Das ist kein C# :gruebel: |
Oh :oops: Ja, es handelt sich hier in der Tat um ein C++-Problem das in der Rubrik Off-Topic besser aufgehoben wäre. Tut mir Leid.
bakachan hat folgendes geschrieben : |
| Ich würde einfach mal behaupten der Threadersteller hat vergessen Fracction von seiner Basisklasse abzuleiten ^^ |
Dem ist leider nicht so. Das (grob gekürzte) Interface von Fraction:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| class Fraction : AlgebraicValue { public: Fraction( int, int ); Fraction* foo( AlgebraicValue const& ); }; |
Bergmann89 - Do 10.06.10 17:06
Hey,
ich bin mir nich ganz sicher, aber ich schreib ma was ich vermute:
C#-Quelltext
1: 2: 3:
| public: AlgebraicValue( void ) : deftype( 0 ) { } |
ist doch keine normale Variable, sonder mehr sowas wie ne Eigenschaft/Property und ich denk da liegt das Problem. Definier dir die Variable mal im private Teil un nenn sie bisl anders. Und dann erstellst du die Eigenschaft der Klasse, in dem du auf die Variable zugreifst, dann sollte das auch in den Kind-Klassen gehen. So in etwa wie
HIER [
http://www.rtr.tu-darmstadt.de/fileadmin/cppkurs/18_2_1Beispiel_1.html] erklärt.
Un dann is mir noch aufgefallen, das du deiner
const char deftype; gar kein Wert zugewiesen hast, geht das?!
€: hab grad gemerkt, dass das ja der Konstruktor is, un du da die const Initialisieren willst. Eine const is eine const, da kammer nix rein schreiben, also steig auf eine Variable um, die nur in der Klasse sichtbar is...
MfG Bergmann.
P4o3n1x - Do 10.06.10 17:16
Bergmann89 hat folgendes geschrieben : |
ich bin mir nich ganz sicher, aber ich schreib ma was ich vermute: C#-Quelltext 1: 2: 3:
| public: AlgebraicValue( void ) : deftype( 0 ) { } | ist doch keine normale Variable, sonder mehr sowas wie ne Eigenschaft/Property und ich denk da liegt das Problem.
[...]
€: hab grad gemerkt, dass das ja der Konstruktor is, un du da die const Initialisieren willst. Eine const is eine const, da kammer nix rein schreiben, also steig auf eine Variable um, die nur in der Klasse sichtbar is... |
Ich arbeite mit einer Initialisierungsliste (
INFO [
http://de.wikipedia.org/wiki/Initialisierungsliste]). Das ist an sich schon korrekt. Ich vermute auch, dass es Probleme mit dem
const-Tag gibt - ich hätte hier jedoch gerne eine Konstante und ich muss sie in der base class definieren da ich wie
fidionael schon richtig erkannt hat zur Typerkennung verwenden möchte.
Bergmann89 - Do 10.06.10 17:25
Hey,
also mach meinem Wissen kann man da nur Variabelen initialisieren. Also musst du wohl leider eine Variable nehmen, aber ich hab auch noch
DAS [
http://www.wer-weiss-was.de/theme158/article3755707.html] gefunden, vlt hilft die das iwie weiter...
€: Hey, hab das grad ma bei mir ausprobiert, und es scheit doch mit const zu gehen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| #include <iostream>
using namespace std;
class AlgebraicValue { public: const int deftype; AlgebraicValue( void ); };
AlgebraicValue::AlgebraicValue(): deftype(1) {
}
int main(int argc, char *argv[]){ AlgebraicValue blaa; cout << blaa.deftype; cin.get(); return 0; } |
MfG Bergmann
P4o3n1x - Do 10.06.10 21:26
Bergmann89 hat folgendes geschrieben : |
Hey,
also mach meinem Wissen kann man da nur Variabelen initialisieren. Also musst du wohl leider eine Variable nehmen, aber ich hab auch noch DAS [http://www.wer-weiss-was.de/theme158/article3755707.html] gefunden, vlt hilft die das iwie weiter...
€: Hey, hab das grad ma bei mir ausprobiert, und es scheit doch mit const zu gehen:
|
Ich sagte doch bereits dass das funktioniert. Wenn du nochmal meinen ersten Post liest, wirst du feststellen, dass ich sagte in
AlgebraicValue treten keine Probleme auf. Das Problem ergibt sich erst bei Ableitung einer Klasse von
AlgebraicValue.
Ich bin nach wie vor leider keinen Schritt weiter.
Edit: Dein Link scheint ein möglicher Work-around zu sein, ich fände jedoch die
const-Lösung eleganter und wüsste immer noch gerne warum sie nicht funktioniert...
Bergmann89 - Fr 11.06.10 00:26
Hey,
sry da hab ich mal wieder zu schnell gelesen ^^
Also ich bekomms bei mir nur mit der Variable zum laufen. Ich bin aber auch erst Anfänger in C&Co, vlt solltest du deine Frage nochma in einem C-Forum stellen...
MfG Bergmann.
P4o3n1x - Fr 11.06.10 16:10
Problem ist gelöst mit freundlicher Unterstützung der Google-comp.lang.c++-Group:
algebraicvalue.h
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| class AlgebraicValue { public: const char deftype;
AlgebraicValue( char c = 0 ) : deftype( c ) { }
virtual AlgebraicValue* foo( AlgebraicValue const& ) = 0; }; |
fraction.h
1: 2: 3: 4: 5: 6:
| class Fraction : public AlgebraicValue { public: Fraction( int, int ); Fraction* foo( AlgebraicValue const& ); }; |
fraction.cpp
1: 2: 3: 4: 5:
| Fraction::Fraction( int a = 0, int b = 1 ) : AlgebraicValue( 1 ) { } |
Liebe Grüße und vielen Dank für eure Bemühungen :-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!