我有一个关于C++中运算符重载的返回值的问题.通常,我发现了两种情况,一种是按值返回,一种是按引用返回.那么这个规则是什么呢?特别是在可以连续使用操作员的情况下,例如cout<<x<<y
.
例如,当实现+操作"string +(string)"时.你将如何通过ref或val返回返回值.
我刚刚开始使用Qt编程,我正在尝试使用一个QTableView
控件来创建一个简单的表格数据布局,该控件具有继承自己的创建的模型类QAbstractTableModel
.出于某种原因,我的表视图最终看起来像这样:
alt text http://users.nerdland.net/tyler/files/pics/qtableview_checkboxes.png
什么在每个单元格中看起来像复选框(但在我点击它们时什么也不做)的东西,我怎么让它们消失?QTableView
除了对象的名称,我没有更改任何属性.
如果重要的话,我的模型代码很简单:
MyTableModel::MyTableModel(QObject* parent)
: QAbstractTableModel(parent)
{
}
MyTableModel::~MyTableModel()
{
}
int MyTableModel::rowCount(const QModelIndex& parent) const
{
return 1000;
}
int MyTableModel::columnCount(const QModelIndex& parent) const
{
return 5;
}
QVariant MyTableModel::data(const QModelIndex& index, int role) const
{
return "Foo";
}
Run Code Online (Sandbox Code Playgroud)
对话框UI在Qt Designer中构建,在对话框的类中,我将模型附加到视图,如下所示:
MyTableModel testModel = new MyTableModel(this);
ui.testTable->setModel(testModel);
Run Code Online (Sandbox Code Playgroud)
除此之外,我不执行任何操作ui.testTable
.
使用Qt 4.6.
根据Qt文档,QVariant::operator==
如果变体包含自定义类型,则无法正常工作:
bool QVariant :: operator ==(const QVariant&v)const
将此QVariant与v进行比较,如果它们相等则返回true; 否则返回false.
在自定义类型的情况下,不调用它们的相等运算符.而是比较值的地址.
你怎么能让这个为你的自定义类型表现得有意义?在我的例子中,我将枚举值存储在QVariant中,例如
在标题中:
enum MyEnum { Foo, Bar };
Q_DECLARE_METATYPE(MyEnum);
Run Code Online (Sandbox Code Playgroud)
功能中的某个地方:
QVariant var1 = QVariant::fromValue<MyEnum>(Foo);
QVariant var2 = QVariant::fromValue<MyEnum>(Foo);
assert(var1 == var2); // Fails!
Run Code Online (Sandbox Code Playgroud)
为了使这个断言成为现实,我需要做些什么呢?
我理解为什么它不起作用 - 每个变体都存储枚举值的单独副本,因此它们具有不同的地址.我想知道如何改变我在变体中存储这些值的方法,以便这不是一个问题,或者它们都引用相同的底层变量.
它不认为我可以绕过需要平等比较才能工作.上下文是我使用此枚举作为a中项目的UserData QComboBox
,我希望能够QComboBox::findData
用于定位与特定枚举值对应的项索引.
当我在头文件中声明一个函数,并将该函数的定义放在其他文件中时,编译器/链接器如何找到定义?它是否系统地搜索其路径中的每个文件,还是有更优雅的解决方案?这一天一直困扰着我,我一直无法找到解释.
假设我有一个MyWidget
包含一个MySubWidget
,例如包含文本字段或其他东西的自定义小部件.我希望其他类能够连接到包含的MySubWidget
实例公开的信号和插槽.传统的方法是这样做:
MySubWidget
通过subWidget()
in中的方法公开指向实例的指针MyWidget
MySubWidget
中的MyWidget
类,并用"转发"的代码选择1似乎是最少的代码,但它也有点破坏封装,因为现在其他类知道包含的小部件MyWidget
是什么并且可能依赖于它们的功能.
选择2似乎保持封装,但它有很多看似冗余且可能错综复杂的代码,这会扰乱整个信号和插槽系统的优雅.
在这种情况下通常做什么?
在C++中,我知道编译器可以选择以它选择的任何顺序初始化静态对象(受一些约束),并且通常您不能选择或确定静态初始化顺序.
但是,一旦编译了一个程序,编译器就必须决定初始化这些对象的顺序.有没有办法从带有调试符号的编译程序中确定将调用静态构造函数的顺序?
上下文是这样的:我有一个相当大的程序,当它在一个新的工具链下构建时,突然在main()之前进行segfaulting.这是一个静态初始化顺序问题,或者它正在加载的某个库有问题.但是,当我使用gdb进行调试时,崩溃位置只是报告为原始地址而没有任何符号信息或回溯.我想通过在第一个静态初始化对象的构造函数中放置一个断点来决定这两个问题中的哪一个,但我不知道如何判断它是哪个对象.
我试图弄清楚如何使用stat()来捕获有关文件的信息.我需要的是能够打印有关文件的几个字段的信息.所以..
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
using namespace std;
int main() {
struct stat buf;
stat("file",&buf);
...
cout << st_dev << endl;
cout << st_ino << endl;
cout << st_mode << endl;
cout << st_nlink << endl;
cout << st_uid << endl;
cout << st_gid << endl;
cout << st_rdev << endl;
cout << st_size << endl;
cout << st_blksize << endl;
cout << st_blocks << endl;
cout << st_atime << endl;
cout << st_mtime << endl; …
Run Code Online (Sandbox Code Playgroud) 请考虑以下代码
template<unsigned int N> void foo(std::bitset<N> bs)
{ /* whatever */ }
int main()
{
bitset<8> bar;
foo(bar);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
g ++在64位上抱怨这个,因为<8>被解释为unsigned long int,它与模板不完全匹配.如果我将模板更改为unsigned long int,那么32位编译会抱怨.
显然,解决这个问题的一种方法是将bitset <8>更改为bitset <8ul>,但有没有办法重新编写模板部分,以便它可以使用数字文字的默认解释?
我收到一条评论说我的一个网站(tumblr主题)在iPad上崩溃了.我没有iPad,所以我想知道你将如何在iPad,iPhone或任何其他智能手机上测试你的网站?
我遇到了一个奇怪的问题,我的系统时钟知道它是夏令时,但glibc似乎没有.这是一个最新的Ubuntu安装,我检查了/ etc/localtime,它有正确的转换时间,用于上周切换到夏令时.
对我来说,目前正确的时区是太平洋夏令时(UTC-7).当我问我的系统我在哪个时区时,它正确告诉我:
$ date +%z
-0700
Run Code Online (Sandbox Code Playgroud)
但是当我运行以下程序时:
#include <time.h>
#include <stdio.h>
int main() {
tzset();
printf("%lu\n", timezone);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是错误的:
28800
Run Code Online (Sandbox Code Playgroud)
对应于UTC-8或太平洋标准时间.(不,TZ未在我的环境中设置)
我认为glibc和日期程序会从同一来源获得他们的时区信息,但显然要么他们没有,要么我误解了glibc时区全球的运作方式.
那么基本问题是: