Autor Beitrag
P4o3n1x
Hält's aus hier
Beiträge: 7

Win XP, Kubuntu 8.04
C#, Java, Delphi
BeitragVerfasst: Do 10.06.10 16:06 
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:

ausblenden 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:

ausblenden 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:

ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 10.06.10 16:26 
Das ist kein C# :gruebel:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
fidionael
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 232

Win XP SP2, Ubuntu 6.06
Delphi 7 PE, Delphi 3 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: Do 10.06.10 16:48 
Ich würde einfach mal behaupten der Threadersteller hat vergessen Fracction von seiner Basisklasse abzuleiten ^^
P4o3n1x Threadstarter
Hält's aus hier
Beiträge: 7

Win XP, Kubuntu 8.04
C#, Java, Delphi
BeitragVerfasst: 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:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
class Fraction : AlgebraicValue
{
  public:
    Fraction( intint );
    Fraction* foo( AlgebraicValue const& );
    // bla bla
};
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Do 10.06.10 17:06 
Hey,

ich bin mir nich ganz sicher, aber ich schreib ma was ich vermute:
ausblenden 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 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.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
P4o3n1x Threadstarter
Hält's aus hier
Beiträge: 7

Win XP, Kubuntu 8.04
C#, Java, Delphi
BeitragVerfasst: 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:
ausblenden 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). 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: 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 gefunden, vlt hilft die das iwie weiter...

€: Hey, hab das grad ma bei mir ausprobiert, und es scheit doch mit const zu gehen:
ausblenden 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

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
P4o3n1x Threadstarter
Hält's aus hier
Beiträge: 7

Win XP, Kubuntu 8.04
C#, Java, Delphi
BeitragVerfasst: 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 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: 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.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
P4o3n1x Threadstarter
Hält's aus hier
Beiträge: 7

Win XP, Kubuntu 8.04
C#, Java, Delphi
BeitragVerfasst: Fr 11.06.10 16:10 
Problem ist gelöst mit freundlicher Unterstützung der Google-comp.lang.c++-Group:

ausblenden 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;
};


ausblenden fraction.h
1:
2:
3:
4:
5:
6:
class Fraction : public AlgebraicValue
{
  public:
    Fraction( intint );
    Fraction* foo( AlgebraicValue const& );
};


ausblenden 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 :-)