【发布时间】: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++ 中学到了很多东西。那里的人可能刻薄、粗鲁和傲慢,所以你需要厚脸皮。但他们也非常聪明,完全知道他们在说什么。