我想在c ++中为成员变量分配一个特定的结构,但是我的尝试失败了。在一些测试之后,我认识到在分配之后变量不保持传递的对象,而是隐式调用复制构造函数并将值复制到新对象。是不是可以用c ++覆盖对象变量?
现在详细情况:
我在c ++方面没有太多经验,但由于尝试为现有的小c库手动创建jni包装器,因此必须编写一些c ++代码。我通过java端的代理类实现它,它只包含c ++对应的地址和重定向方法调用。该库由许多结构组成,我为其编写了java类。成员的分配和访问是通过java端的getter和setter实现的。
//C-lib code
struct A {
int testVal;
...
}
struct B{
struct A a;
...
}
我有两个结构。而第一个包含一些不重要的代码,第一个结构的成员的第二个sonsist。
//java proxy classes
public class A{
private long ADRESS;
public native int getTestVal();
public native void setTestVal(int testVal);
...
}
public class B{
private long ADRESS;
public native A getA();
public native void setA(A a);
...
}
java副本中唯一的变量是长持有地址,通过getter和setter方法提交对b中内部结构的访问。代码字native声明该方法是在本机代码中实现的。
//java test class
public class Test{
public static void main(String[] args){
A a = new A();
B b = new B();
b.setA(a);
}
}
我写了一个java测试类来检查分配是否成功。
//JNI interface method for setA
JNIEXPORT void JNICALL ..._setA
(JNIEnv *env, jobject java_b, jobject java_a){
B *b = getBoundObject<B>(env, java_b);
A *a = getBoundObject<A>(env, java_a);
a->testVal = 999;
b->a = *a;
printf("\nBEFORE ASSIGNMENT %i | %i\n", a->testVal, b->a.testVal);
b->a.testVal = 200;
printf("\nAFTER ASSIGMENT %i | %i\n", a->testVal, b->a.testVal);
}
jni接口实现了c库和java代码之间的层。它是用c ++编写的。 testVal变量表示一个变量,我刚用它来检查对象是否相同。 printf调用的输出如下所示:
#C-site:在分配之前999 | 999
#C-site:999之后的分配| 200
是不是有办法真正将对象分配给变量而不是仅复制值?这很重要,因为对象仍然在java端使用。 建议?
答案 0 :(得分:1)
对我来说,你需要使用指针。无论何时分配对象,都会调用复制构造函数将所有内容复制到新对象中。如果使用指针,则不应分配任何新内容。
因此,你的struct B应该保留一个指向A而不是A对象的指针。然后,您的setA()
参数应为setA(A* a)
。