从静态函数调用非静态变量

时间:2014-11-14 12:31:37

标签: c++

我是C ++的初学程序员,为我的公司做一个PoC。所以我为我的基本问题道歉。

class TestOne{
  private:
    TestTwo* t2;

  void createInstance(TestTwo* param){
    t2 = param;
  }

  static void staticFunctionToAccessT2(){
    // Now here I want to access "t2" here in the current instance of the class
    // By current instance I mean "this" in non-static context
    // currently there is no function to get object, but can be created
    // ** we cannot call new TestOne(), because that will create a new instance
    // ** of the current class and that I don't want.
  }
}

非常感谢在这方面的任何帮助。

由于

=== UPDATE ===

这可以作为我在QT Creator中开发应用程序的场景,其中我有一个预定义签名的静态函数,并且想要访问UI元素以进行文本更改(如TextEdit)

3 个答案:

答案 0 :(得分:1)

即使是在Java中也不能这样做。

static方法只是本地所有实例的本地辅助函数,无法访问单个类状态(例如t2)。

从方法中删除static,或者将成员变量设为static变量,具体取决于您要完成的操作。

编辑:

如果我理解正确,你的SDK需要一个函数指针,它将调用它来修改你的实例't2。你的mutator方法应该是public而非static。所以,我们只是说你重新定义staticFunctionToAccessT2,就像这样:

public: void mutateT2();

如果要调用mutateT2的实例定义为:

TestOne foo;

你的SDK需要一个函数指针,你可以将它传递给:

std::bind(&TestOne::mutateT2, foo)

正如下面Mike Seymour所指出的那样,只有当SDK方法参数为std::function 时,如果其参数是原始函数指针,则此方法才有效。

答案 1 :(得分:0)

静态成员函数没有“当前实例”。

如果您希望将您的类限制为只有一个实例,那么您正在寻找Singleton设计(反)模式,Singleton pattern in C++。它实际上不是那么邪恶,每当我使用具有静态成员变量的类时,我总觉得它很吸引人。

有很多方法可以让单身人士更好地工作,对RAII的密切关注应该是你的目标,当我在我的std::unique_ptr<TestOne> safeInstance;静态方法中初始化时,我会使用getInstance()在我的Android环境中没有例外。

如果您有足够的经验需要提出这个问题,我通常会敦促您不要使用Singleton模式。但它似乎解决了你问题中的大部分问题。

另外,为了调用非静态“变量”,我假设你的意思是“方法”,你的静态函数必须与你的单例实例一起工作,假设它是成功创建的。它甚至可以通过单例实例访问非静态变量

答案 2 :(得分:0)

没有&#34;当前实例&#34 ;;你无法从静态函数访问非静态成员而无法访问某个实例。

根据您的评论,您似乎正在使用具有回调(或类似)机制的损坏的API,该机制不会将用户数据传递给您提供的功能。在这种情况下,您必须找到一些其他方法来获取数据到函数;也许是静态成员:

static TestOne * bodge;
static void staticFunctionToAccessT2(){
    TestTwo * t2 = bodge->t2;
}

因此可以使用API​​

TestOne::bodge = my_t1;
broken_api(&TestOne::staticFunctionToAccessT2);

在API完成回调操作之前,请注意不要将bodge设置为其他值。

较少损坏的API会定义一个回调类型,可以采用&#34;用户数据&#34;参数;也许是一个void*指针,它可以指向任意数据。你可以这样使用它:

static void staticFunctionToAccessT2(void * p) {
    TestOne * t1 = static_cast<TestOne*>(p);
    TestTwo * t2 = t1->t2;
}

less_broken_api(&TestOne::staticFunctionToAccessT2, my_t1);

一个不错的现代API会接受任意可调用类型,因此您可以使用非静态函数:

void memberFunctionToAccessT2() {
    TestTwo * t2 = this->t2;
}

nice_api([=]{my_t1->memberFunctionToAccessT2();});