【问题标题】:How to convert an "ArrayList<ClassNod>" written in Java into a C++ program language?如何将用 Java 编写的“ArrayList<ClassNod>”转换为 C++ 程序语言?
【发布时间】:2013-08-19 19:36:51
【问题描述】:

我用 Java 编写了一个名为 Nod.java 的类。

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 中为“Vase”类编写了一个函数:

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);
    }

但是当我尝试执行此命令时出现错误: listTest.insert(new Nod(vol,op,parent,adancime+1));

IntelliSense:表达式必须具有类类型

错误 1 ​​错误 C2228:'.insert' 左侧必须有类/结构/联合

如何在 listTest 中添加/插入新的 Nod 类?

【问题讨论】:

  • 将Java编写的东西转换成C++的最好方法是重新设计整个东西;两种语言的语义和习语差别太大了。例如,这个类是否有任何子类?是否有任何子类覆盖 getPath
  • 在已经回答的问题中添加另一个问题是个坏主意。不过,您将指针与非指针混合在一起。代码应如下所示:vector&lt;Nod*&gt; Vase::successor(Nod* parent) { vector&lt;Nod*&gt; listTest; listTest.insert(new Nod(...)); return listTest; }
  • 抱歉……下次我会开一个新问题。我写了你所说的,我得到另一个错误:“错误 1 ​​错误 C2661:'std::vector<_ty>::insert':没有重载函数需要 1 个参数”和“IntelliSense:没有重载函数实例”std:: vector<_ty _ax>::insert [with _Ty=Nod *, _Ax=std::allocator]”匹配参数列表”和“IntelliSense:函数调用中的参数太少”。该插入有问题...
  • 我使用“push_back”而不是“insert”,它现在正在工作。感谢您的回答!

标签: java c++ class arraylist


【解决方案1】:

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;
}

【讨论】:

  • 非常感谢您的回答。我试过了,它工作正常。
  • 我编辑了问题,添加了一些东西。请看一看。
【解决方案2】:

您可以编写一个直接翻译成 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*>());
}

【讨论】:

    猜你喜欢
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    相关资源
    最近更新 更多