У меня есть иерархия классов шаблонов,
___ Class (ClassA)
|
AbstractClass_____
|___ Class (ClassB)
в classA и ClassB у меня есть const NullPosition шаблонного типа, который отличается в ClassA и ClassB. В классах classA и ClassB мне нужно выполнить некоторую операцию, которая зависит от значения NullPosition.
Теперь мне нужно выполнить некоторые операции в зависимости от значения NullPosition, но мне трудно, так как переменная имеет другой тип и значения. Чтобы быть более конкретным, NullPosition в classA идентифицирует недопустимый индекс массива, поэтому равен -1; в классе B он идентифицирует указатель NULL, поэтому он равен 0.
Пожалуйста, найдите ниже пример.
#ifndef ABSTRACTCLASS_H
#define ABSTRACTCLASS_H
template <class T, class P>
class AbstractClass
{
public:
typedef T Type;
typedef P Position;
void MethodX() const;
virtual Position Method() const = 0;
};
template <class T, class P>
void AbstractClass<T,P>::MethodX() const
{
Position p=Method();
/*
what I am trying to achieve is being able to use the constant NullPosition in abstract class.
if (p==NullPosition)
cout<<"p is equal NULLPOSITION";
else
cout<<"p is not equal NULLPOSITION";
*/
}
#endif
#ifndef CLASS_A_H
#define CLASS_A_H
#include "../AbstractClass.h"
template <class T>
class Class:public AbstractClass<T,unsigned int>
{
public:
typedef T Type;
typedef typename AbstractClass<T,unsigned int>::Position Position;
Class();
Position Method() const;
static const Position NullPosition=-1;
private:
Type* TypeArray;
unsigned int nElements;
};
template <class T>
Class<T>::Class()
{
nElements=0;
TypeArray=new Type[128];
}
template <class T>
typename Class<T>::Position Class<T>::Method() const
{
return NullPosition;
}
#endif
#ifndef CLASS_B_H
#define CLASS_B_H
#include "../AbstractClass.h"
template <class T>
struct elementNode
{
typedef T Type;
typedef elementNode* Position;
Type element;
Position nextNode;
};
template <class T>
class Class:public AbstractClass<T, typename elementNode<T>::Position>
{
public:
typedef T Type;
typedef typename AbstractClass<T, typename elementNode<T>::Position>::Position Position;
Class();
Position Method() const;
static const Position NullPosition;
private:
Position root;
Position lastElement;
};
template <class T>
const typename Class<T>::Position Class<T>::NullPosition=0;
template <class T>
Class<T>::Class()
{
lastElement=root=NullPosition;
}
template <class T>
typename Class<T>::Position Class<T>::Method() const
{
return NullPosition;
}
#endif
#include <cstdlib>
#include <iostream>
using namespace std;
#include "Class/ClassA/Class.h"
int main(int argc, char *argv[])
{
Class<int> classA;
classA.MethodX();
system("PAUSE");
return EXIT_SUCCESS;
}
Обратите внимание, что ClassA и ClassB имеют одно и то же имя Class, чтобы я мог использовать их взаимозаменяемо в своем коде, изменив только путь включения - #include "Class/ClassA/Class.h" для classA и #include "Class/ClassB" /Класс.h" для класса B.