【问题标题】:error occurs as call to non-static member function without an object argument在没有对象参数的情况下调用非静态成员函数时发生错误
【发布时间】:2020-06-28 07:33:35
【问题描述】:

我正在尝试创建一个与动态数组相关的应用程序。我试图让实例为我的数组调用一个函数,但它给了我错误:

错误:在没有对象参数的情况下调用非静态成员函数

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

ma​​in.cpp

#include "dynamic_array.h"

    int main(){

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

    return 0;
}

【问题讨论】:

  • 使getInstance静态(在类定义中)
  • 该函数也返回int,但您尝试将其分配给指针,您需要在此处进行设计更改。
  • @M.M 当我尝试静态时,我得到错误error: invalid conversion from ‘int’ to ‘DynamicArray&lt;int&gt;*’ [-fpermissive] DynamicArray&lt;int&gt; *array = DynamicArray&lt;int&gt;::getInstance(); ^
  • 是的,我在第二条评论中解决了这个问题
  • @M.M 我应该更改getInstanceinstance 的类型

标签: c++ arrays templates dynamic


【解决方案1】:

我猜你正在尝试同时实现设计模式 Singleton 和向量(一种动态数组)。

这个呢:

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

main.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;
}

【讨论】:

  • 如果在我的 if 条件(instance == 0)中,我如何将某些东西分配给实例作为 int?
  • 好吧,您可能想发布您的整个规范,因为我不明白。如果您的意思是nullptr(零的指针版本),则改为检查nullptr。 C++ 是一种类型化语言,不能只将int 类型分配给DynamicArray&lt;int&gt;* 的变量。除非你想改变底层数组T*
猜你喜欢
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
  • 2012-02-17
  • 2011-10-17
  • 2022-01-08
  • 1970-01-01
相关资源
最近更新 更多