小编wec*_*ing的帖子

从子类转换到超类到子类?

我的程序需要处理不同类型的"音符": NoteShort,NoteLong...不同种类的票据应显示在以不同的方式GUI.我定义了这些笔记的基类,称为NoteBase.

我将这些笔记存储在XML中; 我有一个类从XML文件读取并存储笔记的数据vector<NoteBase *> list.然后我发现我不能得到他们自己的类型,因为他们已经转换为NoteBase *!

虽然if(dynamic_cast<NoteLong *>(ptr) != NULL) {...}可行,但实在太难看了.实现函数take NoteShort *NoteLong *as参数不起作用.那么,有什么好方法可以解决这个问题吗?

更新:谢谢各位回复.我认为它不应该发生 - 但它确实发生了.我以另一种方式实现它,它现在正在工作.但是,据我记得,我确实声明了(纯)虚函数NoteBase,但忘了在派生类的头文件中再次声明它.我猜这就是造成这个问题的原因.

更新2(重要):我从C++ Primer中找到了这个引用,这可能对其他人有帮助:

有时更令人惊讶的是,即使基本指针或引用实际绑定到派生对象,对从base转换为派生的限制仍然存在:

 Bulk_item bulk;
 Item_base *itemP = &bulk;  // ok: dynamic type is Bulk_item
 Bulk_item *bulkP = itemP;  // error: can't convert base to derived
Run Code Online (Sandbox Code Playgroud)

编译器无法在编译时知道特定转换在运行时实际上是安全的.编译器仅查看指针或引用的静态类型,以确定转换是否合法.在我们知道从base到derived的转换是安全的情况下,我们可以使用static_cast(第5.12.4节,第183页)来覆盖编译器.或者,我们可以使用dynamic_cast请求在运行时检查的转换,这将在第18.2.1节(第773页)中介绍.

c++ polymorphism inheritance

6
推荐指数
1
解决办法
1万
查看次数

GTK +菜单栏看起来很糟糕

我按照这里的说明写了一个Gtk +菜单栏.

将条形包装到VBox上时

// "FALSE, TRUE" and "FALSE, FALSE" actually makes no difference
gtk_box_pack_start(GTK_BOX(main_vbox), menu_bar,
                   TRUE, FALSE, 0);
Run Code Online (Sandbox Code Playgroud)

菜单栏看起来很糟糕,像这样:

纤薄的菜单栏

当我改为:

 gtk_box_pack_start(GTK_BOX(main_vbox), menu_bar,
                    TRUE, TRUE, 0);
Run Code Online (Sandbox Code Playgroud)

看起来像:

在此输入图像描述

那么,如何让工具栏分配更小的空间?

gtk menubar

3
推荐指数
1
解决办法
1263
查看次数

为什么在创建JFrame对象并将其设置为可见之后,程序将不会结束执行?

我的程序看起来像这样:

import java.awt.*;
import javax.swing.*;

public class Main {
    public static void main(String[] args) {
        JFrame jf = new JFrame();
        jf.setSize(new Dimension(200, 200));
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setVisible(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么在JVM从main()退出后,我的程序不会立即结束?我注意到如果我删除行"jf.setVisible(true);",它将结束.

它是通过垃圾收集或类析构函数等技术实现的吗?我很感兴趣,如果我想写类似的东西,我怎么能这样做.

java concurrency swing multithreading

3
推荐指数
1
解决办法
1365
查看次数

为什么glOrtho()在Mac下工作但gluOrtho2D()不能?

几天前我发布了这个问题(我不知道打开一个新线程是否合适......但是当我从这篇文章得到答案时我会关闭那个):QGLWidget在Mac OS X Lion下无法正常工作.

我在网上抓了一些示例代码,将它们与我的相比较,并确认问题是由以下因素引起的:

gluOrtho2D(0, w, 0, h);
Run Code Online (Sandbox Code Playgroud)

并在将其更改为:

glOrtho(0, w, 0, h, -1, 1);
Run Code Online (Sandbox Code Playgroud)

并删除了glu作为依赖,我的程序工作.为什么?有什么不同?

opengl glu

3
推荐指数
1
解决办法
976
查看次数

C/C++中的冗余#include?

假设现在我有三个源文件:ClassA.hpp,ClassB.hpp和ClassC.hpp.

ClassB继承自ClassA,ClassC继承自ClassB.

所以,在ClassB.hpp中,我写了#include"ClassA.hpp".那么,在ClassC.hpp中,除了包括ClassB.hpp之外,还应该包括ClassA.hpp吗?

在编写Makefile时,我应该创建ClassC.o的ClassA.oa依赖吗?在cmake中 - 如果我不在ClassC.hpp中编写#include"ClassA.hpp",ClassA.o将不会是ClassC.o的依赖,对吧?这可以吗?

c c++ qmake makefile cmake

2
推荐指数
1
解决办法
599
查看次数