提问者:小点点

检查类是否在方法中实例化


我有一个类,它有几个静态函数,即使没有这个类的实例,也可以调用这些函数。 还有一个方法init(),我用它来设置一些变量。 此方法不是静态的,因此它需要一个实例。 现在,如果这样做了,我希望静态方法的行为不同。 有点像:

static foo(){
  if(noInstance()){
    doA();
  }else(){
    doB();
  }
}

这有可能吗? 或者是一个坏主意,如果有一个实例,就应该让用户调用不同的方法? 谢谢

编辑它听起来很奇怪,但这是我的用例:

class A{

public:
    static inline bool hasInstance = false;
    int data;

static int getData(){
    if(hasInstance){
        return data; // Can't do this from a static function
    }else{
        return 0;
    }
}

};

我知道我无法从静态函数访问数据,因为没有这个指针。 我正在编写一个库,我希望用户能够使用静态方法,如果他不想要一个实例,但是如果有一个实例,它应该使用它的实例的数据。

如果我有一个想法,但我不知道这是不是好的风格:

static int getData(A *ref){
    if(ref != nullptr){
        return data;
    }else{
        return 0;
    }
}

我很高兴听到有更多经验的人告诉我是否应该做那件事。


共2个答案

匿名用户

我想你可以使用一个静态变量,让它命名为count。 用0初始化count,每次创建该类的实例时,都会递增count。 如果count为0,这意味着您没有创建任何实例,因此您不能使用某些方法。

匿名用户

不确定您的最终目标是什么,但我会建议重新考虑您的设计,因为这种statist/hasinstance行为闻起来很难闻。 不管怎么说,这里是你需要的:

using namespace std;

#include <iostream>

class MyClass
{
private:
    static bool hasInstance;
public:
    MyClass()
    {
        hasInstance = true;
    }

    static void foo()
    {
        if (hasInstance) {
            std::cout << "I have an instance\n";
        }
        else {
            std::cout << "No instance\n";
        }
    }
};

bool MyClass::hasInstance = false;

int main () {
    MyClass::foo();
    MyClass a;
    a.foo();
    MyClass::foo();
    return 0;
}

编辑:不要在真正的代码中使用它。 如果你只是好奇,你可以在C++中做几乎所有的事情,所以有时你可以传递对象,这是肮脏和丑陋的,但只是为了演示:使用名称空间std;

#include <iostream>

class MyClass
{
private:
    int someVariable;
public:
    MyClass()
    {
        someVariable = 42;
    }

    static void foo(MyClass *obj = nullptr)
    {
        if (obj) {
            std::cout << obj->someVariable << std::endl;
        }
        else {
            std::cout << "No instance\n";
        }
    }
};

int main () {
    MyClass::foo();
    MyClass a;
    a.foo(&a);
    MyClass::foo(&a);
    return 0;
}