【问题标题】:Port Java EventHandler to C++将 Java EventHandler 移植到 C++
【发布时间】:2014-09-22 10:19:22
【问题描述】:

我是一名 Java 开发人员,目前正在学习 C++。为此,我想我可以尝试用 C++ 编写一些我用 Java 编写的程序;这是我的问题: 如果在 Java 中我有以下类架构:

abstract class Event {}
class Event1 extends Event {/*define some variables and methods here*/}
class Event2 extends Event {/*define some variables and methods here*/}
class MyEventListeners {
    public void event1Listener(Event1 event){/*do something*/}
    public void event2Listener(Event2 event){/*do something*/}
}
class someclass {
    void somemethod(){
        eventHandlerInstance.add(myEventListenersInstance.getClass().getMethod("event1Listener", null);
        eventHandlerInstance.add(myEventListenersInstance.getClass().getMethod("event2Listener", null);
        //OR!
        eventHandlerInstance.add(myEventListenersInstance);
    }
    void someOtherMethod(){
        eventHandlerInstance.fireEvent(new Event1()); // MyEventListeners#event1Listener gets called
    }
}
class EventHandler {
    HashMap<Event, List<Method>> listeners = new HashMap<Event, List<Method>>();
    public void add(Method m){
        if(m.getParameterTypes().length == 1 && m.getParameterTypes()[0].isAssignableFrom(Event.class){
            listeners.get((Event)m.getParameterTypes()[0]).add(m);
        }
    }
    public void add(Class c){
        for(Method m : c.getDeclaredMethods()){add(m);}
    }
    public void fireEvent(Event e){
        for(Event ev : listeners.keySet()){
            if(e instanceof ev.getClass()){
                for(Method m : listeners.get(ev)){m.invoke(e);}
            }
        }
    }

}

此代码可能无法正常工作,因为我只是在两分钟内将其写下来,但它应该可以可视化我正在尝试做什么。问题是,我听说 C++ 不支持反射... 是否可以将此 Java 代码移植到 C++,如果可以,如何?

亲切的问候

【问题讨论】:

  • 我建议在处理 C++ 时忘记所有关于 Java 的知识,并从头开始学习如何以 C++ 的方式做事。试图将 Java 方法映射到 C++ 方法只会导致糟糕的 C++ 设计恕我直言。由于这个原因,我之前在 Java 方面的经验肯定阻碍了我在 C++ 方面的进步。
  • @Galik 感谢您的意见。不过,这给我带来了一个问题:那我究竟应该如何开始学习 C++?几天前,我开始阅读 learningcpp.com 上的教程,但发现自己很快就浏览了其中的大部分内容,因为我已经了解了 Java 的许多“基础知识”。有没有什么,比如为 Java 开发人员学习 C++ 的教程?
  • 我已经用 C++ 编程很多年了,我想我对这门语言有一个公平的处理。但是自从 C++11 推出以来,即使我一直在跟上变化,我还是觉得有必要回到最初的原则,重新学习 C++。所以我很欣赏你在复习你已经知道的材料时的意思。我没有去过 learningcpp.com,但我知道那里有很多糟糕的教程、糟糕的书籍和糟糕的老师,他们教 C++ 很糟糕。通常是因为他们像 C 一样教它。
  • 所以我会推荐一本好书stackoverflow.com/questions/388242/… 也许 Scott Meyers Effective C++ 来自 Java 会很好。留意即将出版的 Scott Meyers 新书(有效的 C++11/14)以及最佳常见问题解答:parashift.com/c++-faq-lite
  • 另外,如果你使用 IRC,我在 FreeNode 上的 ##c++ 中学到了很多东西。那里的人可能刻薄、粗鲁和傲慢,所以你需要厚脸皮。但他们也非常聪明,完全知道他们在说什么。

标签: java c++ events


【解决方案1】:

我没有浏览过你的代码,但是没有,C++ 没有任何运行时类型信息(反射)支持。

如果您使用反射,则需要找到另一种方法来获得相同的结果(可能使用接口或模板),以便将其移植到 C++。

【讨论】:

  • 有点挑剔,但c++确实有一种运行时类型信息的形式,只是它所拥有的不支持反射。
  • @TimB 感谢您的意见。我猜接口和Java中的一样,所以我要阅读一些关于模板的教程。
猜你喜欢
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 2023-03-27
  • 2023-03-08
  • 1970-01-01
  • 2012-06-18
  • 2011-05-17
  • 2013-11-25
相关资源
最近更新 更多