这段代码应该从用户获得一个整数,然后完成程序.如果用户输入的号码无效,则会再次询问用户.
捕获异常后,它用于Scanner.reset()重置扫描仪,但它不起作用.并重新抛出先前的异常.
Scanner in = new Scanner(System.in);
while (true) {
try {
System.out.print("Enter an integer number: ");
long i = in.nextLong();
System.out.print("Thanks, you entered: ");
System.out.println(i);
break;
} catch (InputMismatchException ex) {
System.out.println("Error in your input");
in.reset(); // <----------------------------- [The reset is here]
}
}
Run Code Online (Sandbox Code Playgroud)
我以为Scanner.reset()会重置一切并忘记异常.我在询问用户输入新内容之前先说了一下.
如果我说错了,那么正确的方法是什么?
如何std::array通过初始化列表初始化嵌套(2D)?
template <std::size_t W, std::size_t H>
class Block
{
std::array<std::array<int, W>, H> block;
public:
template <typename ...E>
Block(E&&...e) : block {{std::forward<E>(e)...}} {}
};
Run Code Online (Sandbox Code Playgroud)
该类Block应该能够初始化block成员,如下所示:
Block<3, 2> b {{ {1, 2, 3}, {4, 5, 6} }};
Run Code Online (Sandbox Code Playgroud)
注意:我们可以std::array直接在C++ 11中初始化:
std::array<std::array<int, 3>, 2> b {{ {1, 2, 3}, {4, 5, 6} }};
Run Code Online (Sandbox Code Playgroud)
我正在使用gcc-4.9.0
这是简单的类定义,如
class Base{
public:
virtual void Func(){
cout<<"Func in Base"<<endl;
}
};
class Derived : public Base{
public:
virtual void Func(){
cout<<"Func in Derived"<<endl;
}
}
Base *b = new Derived();
Run Code Online (Sandbox Code Playgroud)
和声明
(b->*&Base::Func)();
Run Code Online (Sandbox Code Playgroud)
调用Func的派生版本,不同于b-> Base :: Func(),它按预期调用基本版本,为什么会发生这种情况,这个调用的含义到底是什么?
我在Netbeans 7.0中编写Qt/C++编码,我希望-O3为我的项目启用编译器切换.构建项目的默认优化级别是-O2Netbeans.
我这样添加-O3:
属性>构建> Qt>专家>自定义定义>添加QMAKE_CXXFLAGS += -O3.
但是在重建项目时,我会看到每个.cpp文件:
g ++.exe -c -O3 -O2 -frtti -fexceptions -mthreads -Wall ...... test.cpp
我认为第一个-O3是第二个-O2和优化级别-O2
如何配置我的项目通过Properties > Build > ....了-O3?或者,我该如何删除-O2?
我知道在Qt中有很多关于内存管理的问题.我也读了这些问题:
但就我而言,我再次感到困惑!
我有一个QTableWidget名字myTable.我通过以下方式添加运行时小部件setCellWidget:
void MyClass::build()
{
for (int i=LOW; i<HIGH; i++)
{
QWidget *widget = new QWidget(myTable);
//
// ...
//
myTable->setCellWidget(i, 0, widget);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我删除所有项目,如下所示:
void MyClass::destroy()
{
for (int i = myTable->rowCount(); i >= 0; --i)
myTable->removeRow(i);
}
Run Code Online (Sandbox Code Playgroud)
这些方法在很长一段时间内多次调用.而且myTable,这些小部件的父母将按照程序的生命周期生活.
剂量方法destroy()相当自动释放内存?或者我必须自己delete分配小部件,如下所示?
void MyClass::destroy2() // This maybe causes to crash !!
{
for (int i = myTable->rowCount(); i >= 0; --i)
{
QWidget *w …Run Code Online (Sandbox Code Playgroud) 我有一个GtkDrawingArea用于可视化数据.根据数据库和用户输入,绘图可能会变得非常大(大于允许的最大GtkDrawingArea大小).因此,我想使用与当前窗口一样大的绘图区域,并在滚动时手动更新它.
如果我使用ScrolledWindow + Viewport方法将滚动条添加到绘图区域,它显然不起作用,因为绘图区域不够大,不需要滚动条.
有没有什么方法可以让视口欺骗认为底层小部件比实际大?如果不是什么是解决这个问题的最佳方法?
注意:我使用Gtk2并且不可能切换到Gtk3.
我目前对以下语句感到困惑 - 虽然这个语句在编译期间会产生错误,但事实并非如此.
// statement 1:
someclass* q(someclass());
Run Code Online (Sandbox Code Playgroud)
我理解这句话是否是这样的
// statement 2:
someclass* q(&someclass());
Run Code Online (Sandbox Code Playgroud)
我想知道为什么语句1不会产生错误,或者即使它有效(我在幕后有什么遗漏?)
如何QFileDialog使用默认目录创建跨平台?
我有一个代码
QFileDialog::getSaveFileName(this,"Save File","/home",tr("Any File (*.*);;Text file (*.txt);;Compressed file (*.zip *.tar *.rar);;Image (*.png *.xpm *.jpg *.tiff)"))
Run Code Online (Sandbox Code Playgroud)
这适用于Linux.但在windows中,用户目录将是"C:\Users".我不知道在Mac.我需要使用默认目录作为用户文件夹进行此对话.怎么做?
我看到了,toNativeSeparators()但这需要更多代码.有没有最简单的方法呢?
我有一个关于二进制兼容性的问题.我有一个类A,它包含一个公共方法foo()和一个属性字符串_foo;
const string foo() {return _foo;}
Run Code Online (Sandbox Code Playgroud)
当我改为
const string& foo(){return _foo;}
Run Code Online (Sandbox Code Playgroud)
它仍然是二进制兼容的吗?谢谢你的帮助!
阅读这个 Q&A,我认为p不应该是一个nullptr即使x是0.我明白了吗?
int main()
{
int x = 0;
std::cin >> x; // Enter `0`
void *p = (void *)x; // or: void *p = reinterpret_cast<void*>(x);
if (!p)
std::cout << "p is nullptr" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
输入0标准输入后,该消息p is nullptr将显示在我的GCC中.根据链接,它不应该评估nullptr,但结果不是我的期望.
代码是否未定义行为?或未指明的结果?为什么要评估nullptr?