我是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)
答案 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();});