我有一个类,它有几个静态函数,即使没有这个类的实例,也可以调用这些函数。 还有一个方法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;
}
}
我很高兴听到有更多经验的人告诉我是否应该做那件事。
我想你可以使用一个静态变量,让它命名为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;
}