Проблема с шаблоном и наследованием - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь сделать все мои классы общими. Но проблема возникла с классом Circle и последующими сразу после него. Где я совершаю ошибку?

Кажется, это работает, когда я обмениваю их на "int". Но это, похоже, не соответствует моим первоначальным потребностям, чтобы классы были общими.

class DrawableObject
{
    public:
    virtual void print()=0;
};

template <typename T>
class Point : public DrawableObject
{

    T x;T y;

    public:
        Point()
        {   x=0;
            y=0;
        }
        Point(T a)
        {   x=a;
            y=a;
        }
        Point(T a,T b)
        {   x=a;
            y=b;
        }
        void setX(T newX)
        {   
            x=newX;
        }
        void setY(T newY)
        {   
            y=newY;
        }
        T getX()
        {   return x;
        }
        T getY()
        {   return y;}
        void print()
        {   cout<<"(X,Y) Coordinates are ("<<x<<","<<y<<")"<<endl;}
};

template <typename U>
class Rectangle : public Point<U>
{


    U width,height;

    public:
        Rectangle()
        {   width=0;
            height=0;
        }
        Rectangle(U a)
        {   width=a;
            height=a;
        }
        Rectangle(U a,U b)
        {   width=a;
            height=b;
        }       
        void setWidth(U newWidth)
        {   width=newWidth;}
        void setHeight(U newHeight)
        {   height=newHeight;}
        U getHeight()
        {   return height;}
        U getWidth()
        {   return width;}
        void print()
        {   cout<<"Rectangle is of area "<<width<<"X"<<height<<endl;}
};

С этого момента возникает проблема

template <typename V>
class Circle : public Point<V>
{

    V radius;

    public:
        Circle():Point()
        {   
            radius=0;
        }
        Circle(V a):Point(a)
        {   
            radius=a;
        }
        Circle(V a,V b,V c):Point(a,b)
        {   
            radius=c;
        }
        void setRadius(V newRadius)
            {radius=newRadius;}
        V getRadius()
            {return radius;}
        void print()
            {cout<<"Circle with centre at  ("<<getX()<<","<<getY()<<") and of radius "<<radius<<endl;}
};

Ошибка появляется как эта ниже.

oops_case_study.cpp: In constructor ‘Circle<V>::Circle()’:
oops_case_study.cpp:81:12: error: class ‘Circle<V>’ does not have any field named ‘Point’
   Circle():Point()
            ^~~~~

1 Ответ

0 голосов
/ 08 апреля 2019

Когда вы вызываете конструктор базового класса из производного конструктора, вам также необходимо указать параметр шаблона для базового класса, как показано ниже.

    Circle() : Point<V>()
    {   
        radius=0;
    }

обратите внимание, что конструктор Point называется как Point<V>()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...