Как создать экземпляр объекта, наследуемого от чисто виртуального класса, который использует шаблоны - PullRequest
0 голосов
/ 06 октября 2019

Я работаю над созданием интерфейса "Array_Base", который позволит пользователю создавать либо фиксированный массив, либо расширяемый массив любого типа. Сейчас я даже не могу заставить работать обычный массив.

Я разбил проблему на несколько ее самых простых компонентов, чтобы попытаться изолировать проблему. Я считаю, что это как-то связано с моей инстанцией. Я использую Visual Studio для запуска кода.

Array_Base.h

#ifndef _ARRAY_BASE_H_
#define _ARRAY_BASE_H_
#include <cstring>          // for size_t definition

template <typename T>
class Array_Base 
{
public:
        typedef T type;
    //Default Constructor
    virtual void Array_Base(void) = 0;

    // Destructor.
    virtual ~Array_Base(void) = 0;

protected:
    /// Pointer to the actual data.
    T* data_;

    /// Current size of the array.
    size_t cur_size_;

    /// Maximum size of the array.
    size_t max_size_;
};

#endif   // !defined _ARRAY_H_

Array.h

#ifndef _ARRAY_H_
#define _ARRAY_H_
#include <cstring>          // for size_t definition
#include "Array_Base.h"

template <typename T>
class Array : public Array_Base
{
    public:
    /// Type definition of the element type.
    typedef T type;

    /// Default constructor.
    Array (void);

        ///Destructor
    ~Array (void);
};

#include "Array.cpp"
#include "Array.inl"
#endif   // !defined _ARRAY_H_

Array.cpp

#include <stdexcept>         // for std::out_of_bounds exception
#include <iostream>
#define MAX_SIZE_ 20

template <typename T>
Array <T>::Array (void)
        :data_(new T[MAX_SIZE_]),
    cur_size_(0),
    max_size_(MAX_SIZE_)
{       }

template <typename T>
Array <T>::~Array (void)
{
    delete[] this->data_;
    this->data_ = nullptr;
}

Main.cpp:

#include "Array.h"

int main(void)
{   
    Array_Base<int>* arr = new Array<int>();
        delete arr;
}

Я продолжаю получать сообщение об ошибке: «тип значения« Массив »нельзя использовать для инициализации объекта типа« Array_Base »из красной линии, которая появляется под надписью" новый "Оператор в основном.

Любая помощь будет принята с благодарностью. Спасибо!

1 Ответ

0 голосов
/ 06 октября 2019
template <typename T>
class Array : public Array_Base

Array_Base не называет класс. Вам необходимо предоставить аргумент шаблона.

Вы имеете в виду это?

template <typename T>
class Array : public Array_Base<T>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...