» »

[C++] Problem z dedovanjem šablon (template inhieritance)

[C++] Problem z dedovanjem šablon (template inhieritance)

jlpktnst ::

++++++++++ linked.h +++++++++
#ifndef _LINKED1_H
#define _LINKED1_H

#include <cstring>

/* one-way linked list */

// BASIC NODE CLASS

template <class T>
class Node
{
protected:
	Node<T> * next;
	T * data;	
	long count;
	
public:	
	Node ();
	Node ( Node<T> * nxt );
	Node ( Node<T> * nxt, T * dat );
	Node ( Node<T> & src );
	Node ( T * dat );
	~Node ();
	
	virtual void Append ( T * d );
	virtual void Add ( T * d ); // sorted - class T must have working < and == operators |this will sort in ascending order; counting the same instances
};

// HEAD NODE CLASS

template <class T>
class HeadNode : public Node<T>
{
public:
	HeadNode ();
	~HeadNode ();

	void Add ( T * d );
};

// TAIL NODE CLASS

template <class T>
class TailNode : public Node<T>
{
public:
	TailNode ();
	void Append ( T * d );
};

// BODY NODE CLASS

template <class T>
class BodyNode : public Node<T>
{
public:
	
};

#endif

++++++++++ linked.cpp +++++++++++
#include "linked1.h"

/* one-way linked list */

// LINKED LIST CLASS


// BASIC NODE CLASS

template <class T>
Node<T>::Node ()
{
	next = NULL;
	data = NULL;
	count = 0;
}

template <class T>
Node<T>::Node ( Node<T> * nxt )
{
	data = NULL;
	next = nxt;
	count = 0;
}

template <class T>
Node<T>::Node ( Node <T> * nxt, T * dat )
{
	data = new T;
	memcpy ( data, dat, sizeof (T) );
	next = nxt;
	count = 1;
}

template <class T>
Node<T>::Node ( Node<T> & src )
{
	next = src.next;
	data = new T;
	memcpy ( data, src.data, sizeof (T) );
	count = 1;
}

template <class T>
Node<T>::Node ( T * dat )
{
	next = NULL;
	data = new T;
	memcpy ( data, dat, sizeof (T) );
	count = 1;
}

template <class T>
Node<T>::~Node ()
{
	next = NULL;
	if (data!=NULL)
		delete data;
}


template <class T>
void Node<T>::Append ( T * d )
{
	Node<T> * temp = next;
	next = new Node<T> ( temp, d );
}

template <class T>
void Node<T>::Add ( T * d )
{
	if ( next->count == -1 )
		Append ( d );
	
	else if ( data == d )
		count++;
		
	else if ( (data < d) && (d < next->data) )
		Append ( d );
		
	else
		next->Add ( d );
		
	return;
}

	
// HEAD NODE CLASS

template <class T>
HeadNode<T>::HeadNode ()
{
	next = new TailNode<T>;
}

template <class T>
HeadNode<T>::~HeadNode()
{
	delete next;
}

template <class T>
void HeadNode<T>::Add ( T * d )
{
	if ( next->count == -1 )
		Append ( d );
		
	else if ( d < next->data )
		Append ( d );
		
	else
		next->Add ( d );
		
	return;
}


// TAIL NODE CLASS	

template <class T>
TailNode<T>::TailNode ()
{
	count = -1;
}

template <class T>
void TailNode<T>::Append ( T * d )
{
	return;
}

// BODY NODE CLASS



Napaka ki jo zadeva vrže:
 C:\dev\aps1\Naloga1\linked1.cpp In constructor `HeadNode<T>::HeadNode()': 
94 C:\dev\aps1\Naloga1\linked1.cpp `next' undeclared (first use this function) 
  (Each undeclared identifier is reported only once for each function it appears in.) 
 C:\dev\aps1\Naloga1\linked1.cpp In destructor `HeadNode<T>::~HeadNode()': 
100 C:\dev\aps1\Naloga1\linked1.cpp `next' undeclared (first use this function) 

...
itd.


---
Zadeva: v starševskem razredu Node je kot protected deklariranih nekaj spremenljivk. Podedovani razredi bi morali imeti te spremenljivke vsebovane kot protected (ker gre za public dedovanje) - vsaj tako sem jaz razmišljal. Ko sem z zadeve vrgel template ven še vedno ni delovalo, dokler nisem spremenljivk deklariral public. Druga rešitev tukaj je da naredim public metode ki dostopajo do spremenljivk, kar tudi ni ravno različna od trenutne. Na videz enostaven problem ... zadevo pa vseeno hočem imeti približno v tem smislu. (lahko bi naredil v cju, javi, whatevah; samo hočem tako, kot bi tudi tu moralo delovat).

Hvala za pomoč.

ps. zaprite topic, ki sem ga zaj***l, se opravičujem

Nejc

OwcA ::

Zbaši tudi implementacije metod kar v deklaracijo razredov. To pogosto pomaga.
Otroška radovednost - gonilo napredka.

Vesoljc ::

pogosto?
templati rabijo implementacijo v header-ju...
Abnormal behavior of abnormal brain makes me normal...

OwcA ::

Uhg, sploh nisem opazil, da je razbito v 2 dateki. :8)
Otroška radovednost - gonilo napredka.

jlpktnst ::

#ifndef _LINKED1_H
#define _LINKED1_H

#include <cstring>

/* one-way linked list */

// BASIC NODE CLASS

template <class T>
class Node
{
protected:
	Node<T> * next;
	T * data;	
	long count;
	
public:	
	Node () {
		 next = NULL; 
		 data = NULL; 
		 count = 0; };
	Node ( Node<T> * nxt ) {
		 data = NULL;
		 next = nxt;
		 count = 0; };
	Node ( Node<T> * nxt, T * dat ) {
		 data = new T;
		 memcpy ( data, dat, sizeof (T) );
		 next = nxt;
		 count = 1; };
	Node ( Node<T> & src ) {
		 next = src.next;
		 data = new T;
		 memcpy ( data, src.data, sizeof (T) );
		 count = 1; };
	Node ( T * dat ) {
		 next = NULL;
		 data = new T;
		 memcpy ( data, dat, sizeof (T) );
		 count = 1; };
	~Node () {
		  next = NULL;
		  if (data!=NULL)
		  	 delete data; };
	
	virtual void Append ( T * d ) {
			Node<T> * temp = next;
			next = new Node<T> ( temp, d ); };
	virtual void Add ( T * d ) { // sorted - class T must have working < and == operators |this will sort in ascending order; counting the same instances
			if ( next->count == -1 )
   			   Append ( d );
	   	  	else if ( data == d )
				 count++;
			else if ( (data < d) && (d < next->data) )
				 Append ( d );	
			else
				next->Add ( d );
			return; };
};

// HEAD NODE CLASS

template <class T>
class HeadNode : public Node<T>
{
public:
	HeadNode () {
	    next = new TailNode<T>; };
	~HeadNode () {
		delete next; };

	void Add ( T * d ) {
	    if ( next->count == -1 )
 		   Append ( d );		
		else if ( d < next->data )
			 Append ( d );	
		else
			next->Add ( d );
		return; };
};

// TAIL NODE CLASS

template <class T>
class TailNode : public Node<T>
{
public:
	TailNode () {
		count = -1; };
	void Append ( T * d ) {
		return; };
};

// BODY NODE CLASS

template <class T>
class BodyNode : public Node<T>
{
public:
	
};

#endif


Enako; "next undeclared" itd.

Vesoljc ::

1. kje uporabljas TailNode, kje ga pa definiras?
2. pravi da ne najde nexta. kot kaze mu lahko to izrecno poves:
   HeadNode<T>::next = 0;

3. kar se pa tice pravic dostopanja, mi je vse skupi rahlo cudno...
Abnormal behavior of abnormal brain makes me normal...

64202 ::

Zanimivo, da tole g++ 3.3.5 pozre, 4.0.2 pa ne:
template <class T>
class A {
        protected:
                int x;

        public:
                A()
                {
                }
};

template <class T>
class B: public A<T> {
        public:
                B()
                {
                        x = 1;
                }
};


Takole sem potem 4.0.2 prisilil v sodelovanje. Ocitno se en obskuren del c++-sa. Bi bilo zanimivo, ce bi kdo to se na vc++ 2003/2005 in icc-ju probal!
template <class T>
class A {
        protected:
                int x;

        public:
                A()
                {
                }
};

template <class T>
class B: public A<T> {
        public:
                B()
                {
                        A<T>::x = 1;
                }
};
I am NaN, I am a free man!

64202 ::

Pa pametno je, da TailNode skopiras pred HeadNode. Namrec se eno mesto, kjer te g++ 3.3 spusti skozi, 3.4/4.0 pa ne.

Hehe, vesoljec me je malo prehitel :)
I am NaN, I am a free man!

Zgodovina sprememb…

  • spremenilo: 64202 ()

Vesoljc ::

sem probal na vc7, pa je precej manj tezaski...
Abnormal behavior of abnormal brain makes me normal...

jlpktnst ::

Ja hvala; prišel sem 1 korak naprej. Zadeva bo delovala če dam spremenljivke kot public, kar bom zaenkrat naredil (ta hudič ne dovoli otroku dostopa do protected elemetov starša, res obupen compiler - mingw g++ 3.4.2)

template <class T>
class TailNode;

sem dal pred HeadNode in je ok;

Vesoljc ::

ne, sej dovoli, samo na enakem levelu mora bit (public->public, protected->protected) kar je rahlo cudno...
Abnormal behavior of abnormal brain makes me normal...

jlpktnst ::

Ah, pozna kdo kak uporaben compiler, ki se celo drži standardov (compiler, ki ne dovoli spodobnega dedovanja se težko kliče c++ compiler in sodi v smeti)?

Ali pa jaz nimam pojma o c++ in je to čisto normalno?

Zgodovina sprememb…

  • spremenil: jlpktnst ()

OwcA ::

Intel C++ Compiler.
Otroška radovednost - gonilo napredka.

Gundolf ::

Tudi Microsoftov (od verzje 2003 dalje) je dokaj spodoben in celo zastonj (compiler, brez IDE).


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Naloga iz Putka - UPM

Oddelek: Programiranje
242053 (1389) NejcSSD
»

[c#] iz class v class

Oddelek: Programiranje
5806 (680) darkolord
»

[C#] Simobilov Glasnik

Oddelek: Programiranje
134171 (1251) Mrch
»

C++ programi

Oddelek: Programiranje
72430 (2026) ERGY

defekt - c++

Oddelek: Programiranje
51030 (948) Vesoljc

Več podobnih tem