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 = 0int b = 1 )
          : deftype( 1 )
{
  // init bla bla
}


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 user profile iconChristian 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

user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconbakachan hat folgendes geschrieben Zum zitierten Posting springen:
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( intint );
    Fraction* foo( AlgebraicValue const& );
    // bla bla
};


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

user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:

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 user profile iconfidionael 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

user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
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( intint );
    Fraction* foo( AlgebraicValue const& );
};



fraction.cpp
1:
2:
3:
4:
5:
Fraction::Fraction( int a = 0int b = 1 )
          : AlgebraicValue( 1 )
{
  // init bla
}


Liebe Grüße und vielen Dank für eure Bemühungen :-)