2014-03-03 109 views
-1

我想給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端。 意見?

回答

1

在我看來,你需要使用指針。任何時候你分配一個對象,都會調用複製構造函數將所有內容複製到新對象中。如果你使用指針,則不應該分配新的東西。

因此,你的結構B應該保持一個指針而不是A對象。那麼你的setA()參數應該是setA(A* a)

+0

我也考慮過這樣做,但並不是因爲它會使它直接修改lib內部的代碼,我想避免的是必要的。但是,如果這種行爲是不可改變的,那麼我應該只是刪除setter。 – codeDragon

+0

哦,其實我只是意識到你的setter和getter函數是用Java編寫的。但是,你想要的仍然是指針,因爲將一個對象分配給一個變量隱含地克隆了該對象。如果您想將原始對象分配給新變量,則必須使用指針。 – stakSmashr