ошибка возникает при вызове функции-члена non-stati c без аргумента объекта - PullRequest
1 голос
/ 17 марта 2020

Я пытаюсь создать приложение, связанное с динамическими c массивами. Я пытаюсь получить экземпляр, вызывающий функцию для моего массива, но он выдает мне ошибку:

error: вызов функции-члена non-stati c без аргумента объекта

Что-то не так с типом функции getInstance () ?

Вот мой заголовок и основной файл:

dynamic_array.h

    #ifndef DYNAMIC_ARRAY_H
#define DYNAMIC_ARRAY_H

template <class T>
class DynamicArray{
private:
    T *arr;
    static int instance;

public:
    int getInstance();
};

template <typename T>
int DynamicArray<T>::getInstance(){
    if(instance == 0){
        //...
    }
    return instance;
}

template <typename T>
int DynamicArray<T>::instance = 0;

#endif // DYNAMIC_ARRAY_H

основной. cpp

#include "dynamic_array.h"

    int main(){

    DynamicArray<int> *array = DynamicArray<int>::getInstance(); // Error occurs here

    return 0;
}

1 Ответ

0 голосов
/ 17 марта 2020

Полагаю, вы пытаетесь сразу реализовать шаблон проектирования Singleton и вектор (вид динамического c массива).

Как насчет этого:

dynamic_array.h

#ifndef DYNAMIC_ARRAY_H
#define DYNAMIC_ARRAY_H

#include <iostream>

template <class T>
class DynamicArray
{
private:
    static DynamicArray* instance;
    T* arr;

    /* singleton pattern
        forbid outside access to constructor */

    DynamicArray();
    DynamicArray(size_t size_of_array);
    ~DynamicArray();

public:
    static void createInstance(size_t size_of_array);
    static DynamicArray<T>* getInstance();
    static void destroyInstance();
};

template <class T>
DynamicArray<T>* DynamicArray<T>::instance = nullptr;

// singleton methods

template<class T>
inline void DynamicArray<T>::createInstance(size_t size_of_array)
{
    if (instance) return;
    instance = new DynamicArray(size_of_array);
}

template <typename T>
DynamicArray<T>* DynamicArray<T>::getInstance()
{
    // might be nullptr if not initialized

    return instance;
}

template<class T>
inline void DynamicArray<T>::destroyInstance()
{
    // delete check for nullptr on its own

    delete instance;
}

// constructor

template<class T>
inline DynamicArray<T>::DynamicArray(size_t size_of_array)
{
    std::cout << "DynamicArray's been constructed.\n";
    arr = new T[size_of_array];
}

// destructor

template<class T>
inline DynamicArray<T>::~DynamicArray()
{
    delete[] arr;
    std::cout << "DynamicArray's destructor has been called.\n";

    // instance is still alive
}

#endif

основной. cpp

#include "dynamic_array.h"

int main()
{
    DynamicArray<int>::createInstance(10);
    DynamicArray<int>* instance = DynamicArray<int>::getInstance();

    // do something with instance

    /* manually call destructor, 
    so that if more pointers are pointing to instance
    they have no access to a delete call */

    DynamicArray<int>::destroyInstance();

    return 0;
}
...