[C++] Når inte Parent-variabler utan this-pekare...

Permalänk
Medlem

[C++] Når inte Parent-variabler utan this-pekare...

Hej,

Jag har en klass SimplePlotter som ärver BasePlotter. BasePlotter har ett antal klassvariabler som Protected.

template <typename Type> class SimplePlotter : public BasePlotter<Type> { public: SimplePlotter( int positionX, int positionY, int width, int height ); ~SimplePlotter(); void plot( std::vector<Type> &Y ); void plot( std::vector<Type> &X, std::vector<Type> &Y ); private: };

/** Base class supplying the platform for all graphs and plots. */ template <typename Type> class BasePlotter { public: BasePlotter( int positionX, int positionY, int width, int height, int margin ); virtual ~BasePlotter(); //void SetDataSource( unsigned datapoints, Type *data ); //void SetData( std::vector<Type> data ); virtual void plot( std::vector<Type> &Y ) = 0; virtual void plot( std::vector<Type> &X, std::vector<Type> &Y ) = 0; void setGraphColour( GLfloat R, GLfloat G, GLfloat B ) ; void setDataColour( GLfloat R, GLfloat G, GLfloat B ) ; protected: void drawBorders(); int transformXdimToGraphSpace( Type value ) {}; int transformYdimToGraphSpace( Type value ) {}; GLfloat graphColour[3]; GLfloat dataColour[3]; int positionX, positionY, width, height; ///< Positional data for graph object. int margin; ///< Margin between graph object border and actual drawing area in pixels. int dataBorderX1,dataBorderX2,dataBorderY1,dataBorderY2; ///< Area for actual data. private: };

Problemet är att SimplePlotter ser inte variablerna i BasePlotter om jag inte använder this-pekaren:

template <typename Type> void SimplePlotter<Type>::plot( std::vector<Type> &Y ) { float distBetweenDatapoints = this->width-2*margin; }

width hittas i exemplet ovan, men margin fallerar:

Citat:

error: ‘margin’ was not declared in this scope

Visa signatur

Archlinux, Sway och Rust, vad mer behövs?

Permalänk
Hedersmedlem

Jag får det inte att misslyckas (visual studio 2010).

Permalänk
Medlem

Hur ser dina konstruktorer ut ?
Initierar du basklassens margin variabel när du skapar SimplePlotterklassen(dvs i SimplePlotter klassens konstruktor) ?
Din basklass BasePlotter tar ju in en marginvariabel som du inte tar in i din subklass SimplePlotter.

Visa signatur

Namn : Jesper | Ålder : 45 | In-game namn : iller
Yrke : Matematisk modellerare (finansiell matematik), mjukvaruutvecklare för risksystem.
Utbildning : Doktor i matematik + en del mat-stat, numme och IT-relaterat.

Permalänk
Medlem

Är helt enligt standarden. Anledningen till att det fungerar i Visual C++ är att standarden inte helt följs i detta avseende.

"In the definition of a class template or a member of a class template, if a base class of the class template depends on a template-parameter, the base class scope is not examined during unqualified name lookup either at the point of definition of the class template or member or during an instantiation of the class template or member."

http://stackoverflow.com/questions/11405/gcc-problem-using-a-...

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk
Medlem

Hela basklassen och simplePlotter finns på https://gist.github.com/1074480

SimplePlotters konstruktor ska anropa basklassens konstruktor där alla variabler sätts.

Jag använder GCC 4.5.2.

Visa signatur

Archlinux, Sway och Rust, vad mer behövs?

Permalänk
Medlem
Skrivet av MagnusL:

Är helt enligt standarden. Anledningen till att det fungerar i Visual C++ är att standarden inte helt följs i detta avseende.

"In the definition of a class template or a member of a class template, if a base class of the class template depends on a template-parameter, the base class scope is not examined during unqualified name lookup either at the point of definition of the class template or member or during an instantiation of the class template or member."

http://stackoverflow.com/questions/11405/gcc-problem-using-a-...

Intressant. Då är allt som det ska då. Bara att börja infoga this-pekare.

Visa signatur

Archlinux, Sway och Rust, vad mer behövs?

Permalänk
Medlem
Skrivet av Gräs-Mannen:

Hela basklassen och simplePlotter finns på https://gist.github.com/1074480

SimplePlotters konstruktor ska anropa basklassens konstruktor där alla variabler sätts.

Jag använder GCC 4.5.2.

Gör den verkligen det när du inte har någon defaultkonstruktor? Jag är lite rostig, men jag skulle tro att du måste anropa superklassens konstruktor manuellt med en initieringslista i subklassen om du vill ha allt väldefinerat.