2013-08-17 69 views
1

我在Java中編寫了一個名爲Nod.java的類。如何將Java中編寫的「ArrayList <ClassNod>」轉換爲C++程序語言?

import java.util.ArrayList; 
import java.util.Arrays; 

class Nod { 
     int[] vol; 
     String op=""; 
     Nod parent; 
     int adancime; 

     Nod (int[] vol, String op,Nod parent,int adancime){    
      this.vol=vol; 
      this.op=op; 
      this.parent = parent; 
      this.adancime=adancime; 
      } 

     public String toString() { 
     return op; 
     } 

     public int getAdancime() { 
       return adancime; 
     } 

     public ArrayList<Nod> getCale(ArrayList<Nod> lnoduri) { 
     lnoduri.add(0, this); 
     if (parent != null) lnoduri = parent.getCale(lnoduri); 
     return lnoduri; 
     } 

     public ArrayList<Nod> getCale() 
     { return(getCale(new ArrayList<Nod>())); } 
} 

,我想重寫它在C++中,但我不知道如何在C++重寫這兩個功能:

public ArrayList<Nod> getPath(ArrayList<Nod> lnoduri) { 
    lnoduri.add(0, this); 
    if (parent != null) lnoduri = parent.getPath(lnoduri); 
    return lnoduri; 
} 

public ArrayList<Nod> getPath(){ 
    return(getPath(new ArrayList<Nod>())); 
} 

這些功能存儲每點頭父路徑。

你能幫助我嗎?

編輯

因爲它是一個相關的問題,我在這裏添加它。

我用Java寫了一個函數爲「花瓶」類:

public ArrayList<Nod> succesori(Nod parent) { 

    // "Nod" is another class.       
    ArrayList<Nod> listTest = new ArrayList<Nod>(); 

    // operations/conditions; 

    listTest.add(new Nod(vol,op,parent,adancime+1)); 
    return(listTest); 
} 

,我想在C重寫++:

vector<Nod*> Vase::succesori(Nod *parinte) 
{ 
    vector<Nod*> *listTest = new vector<Nod*>(); 

    // operations/conditions; 

    listTest.insert(new Nod(vol,op,parent,adancime+1)); 
    return (*listTest); 
    } 

但我得到一個錯誤,當我嘗試EXECUT這個命令: listTest.insert(new Nod(vol,op,parent,adancime + 1));

智能感知:表達式必須具有類類型

錯誤1錯誤C2228:左 '.insert' 必須有類/結構/聯合

我如何添加/插入在listTest一個新的Nod類?

+3

轉換的東西用Java編寫的C++的最好的辦法是重新設計整個事情;這兩種語言的語義和習語太不一樣了。例如,這個類是否有任何子類?是否有任何子類重寫'getPath'? – Joni

+1

向已經回答的問題添加另一個問題是個不錯的主意。不過,你正在混合使用非指針的指針。代碼應該看起來如下:'vector Vase ::後繼者(Nod *父){vector listTest; listTest.insert(new Nod(...));返回listTest; }' – nosid

+0

對不起,因爲這個......下次我會開一個新的問題。我寫了你所說的,並且我得到了另一個錯誤:「錯誤錯誤C2661:'std :: vector <_Ty> :: insert':沒有重載函數需要1個參數」和「IntelliSense:沒有重載函數的實例」std ::向量<_Ty, _Ax> :: insert [與_Ty = Nod *,_Ax = std :: allocator ]「匹配參數列表」和「IntelliSense:函數調用中的參數太少」。該插入有什麼不對... – Romulus

回答

3

Java代碼看起來有點奇怪。如果你真的想使用遞歸,那麼我建議如下重寫方法。

public void getCale(ArrayList<Nod> lnoduri) { 
    if (parent != null) { 
     parent.getCale(lnoduri); 
    } 
    lnoduri.add(this); 
} 

public ArrayList<Nod> getCale() { 
    ArrayList<Nod> result = new ArrayList(); 
    getCale(result); 
    return result; 
} 

在C++中,我只使用一個成員函數。

std::vector<Nod*> getCale() 
{ 
    std::vector<Nod*> result; 
    for (Nod* n = this; n; n = n->_parent) { 
     result.push_back(n); 
    } 
    std::reverse(result.begin(), result.end()); 
    return result; 
} 
+0

非常感謝您的回答。我試過了,它正在工作。 – Romulus

+0

我編輯了這個問題,加了一些東西。請看一看。 – Romulus

1

你可以寫一個直接翻譯成C++,但是如果你這樣做,程序可能會很難維護和緩慢。只要記住,所有的方法都是通過默認的虛擬,對象由指針過去了,vector替代ArrayList

virtual vector<nod*> *getCale(vector<nod*> *lnoduri) { 
    lnoduri->insert(lnoduri->begin(), this); 
    if (parent != nullptr) lnoduri = parent->getCale(lnoduri); 
    return lnoduri; 
} 

virtual vector<nod*> *getCale() { 
    return getCale(new vector<nod*>()); 
} 
相關問題