我想給C++中的成員變量指定一個特定的結構,但是我的嘗試失敗了。經過一些測試後,我認識到在分配之後,變量不會保存傳遞的對象,而是隱式調用複製構造函數,並將值複製到新對象。難道不可以在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同行唯一的變量是長保持ADRESS,接入到內結構中B通過獲取和設置方法submited。代碼字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測試類來檢查assigment是否成功。
//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:BEFORE ASSIGNMENT 999 | 999
#C-site:AFTER ASSIGMENT 999 | 200
是不是有辦法將對象真正分配給變量而不是隻複製值?這很重要,因爲這些對象仍然用在java端。 意見?
我也考慮過這樣做,但並不是因爲它會使它直接修改lib內部的代碼,我想避免的是必要的。但是,如果這種行爲是不可改變的,那麼我應該只是刪除setter。 – codeDragon
哦,其實我只是意識到你的setter和getter函數是用Java編寫的。但是,你想要的仍然是指針,因爲將一個對象分配給一個變量隱含地克隆了該對象。如果您想將原始對象分配給新變量,則必須使用指針。 – stakSmashr