#include <iostream>
class A {
protected:
void foo()
{}
};
class B : public A {
public:
void bar()
{
std::cout << (&A::foo) << std::endl;
}
};
int main()
{
B b;
b.bar();
}
Run Code Online (Sandbox Code Playgroud)
这里我试图获取基类的受保护成员函数的地址.我收到了这个错误.
main.cpp: In member function ‘void B::bar()’:
main.cpp:5: error: ‘void A::foo()’ is protected
main.cpp:13: error: within this context
make: *** [all] Error 1
Run Code Online (Sandbox Code Playgroud)
将foo改为公共工程.还有印刷&B::foo作品.能否解释为什么我们无法获得基类的受保护成员函数的地址?
众所周知,Qt小部件使用隐式共享.所以我对stl容器感兴趣std::vector,也std::string使用隐式共享.
如果不是,为什么?因为它非常有用.
如果答案是肯定的,我们如何确定它?我需要简单的C++ stl程序,它表明stl容器使用隐式共享.复制时不执行深层复制.
据我所知,qApp是全局指针,因此它应该可以在任何地方访问,但我收到此错误 error: qApp was not declared in this scope.
1 #include "textEdit.h"
2
3 TextEdit::TextEdit() {
4 }
5
6 void TextEdit::insertFromMimeData (const QMimeData * source) {
7 if (qApp->mouseButtons() == Qt::MidButton) {
8 return;
9 }
10 QTextEdit::insertFromMimeData(source);
11 }
12
13
Run Code Online (Sandbox Code Playgroud) int a[10];
int b[10];
a = b;
Run Code Online (Sandbox Code Playgroud)
//
struct test {
int a[10];
};
test a,b;
a = b;
Run Code Online (Sandbox Code Playgroud)
第一个代码不编译,因为我们不能分配数组,但第二个代码.类的默认赋值运算符不是简单地为每个数据成员调用赋值吗?为什么第二个代码会编译?
要向模型添加新行,我正在调用beginInsertRows和endInsertRows().如何配置视图以滚动到新添加的行并选择它.我可以通过发送一些信号来做到这一点,但也许Qt有标准的方式.
我正在调试一个程序.我需要知道是否为某个类调用了复制构造函数.由于我没有定义复制构造函数,因此编译器已生成它.我试图定义它并放一些cout但现在我必须手动编写复制部分.这堂课很大,所以我不想这样做.有没有办法检查复制构造函数是否被调用,但避免写入其成员的复制.如何调用复制构造函数的默认实现?
众所周知,std::move不应该将其应用于函数返回值,因为它可以阻止RVO(返回值优化).我感兴趣的是,如果我们确实知道RVO不会发生,我们应该怎么做.
这就是C++ 14标准所说的[12.8/32]
当满足复制/移动操作的省略标准时,但不满足异常声明,并且要复制的对象由左值指定,或者当返回语句中的表达式是(可能带有括号的)id-时表达式,用于在最内层封闭函数或lambda-expression的body或parameter-declaration-clause中声明的具有自动存储持续时间的对象,首先执行重载决策以选择复制的构造函数,就像对象由rvalue指定一样.如果第一个重载决策失败或未执行,或者所选构造函数的第一个参数的类型不是对象类型的rvalue引用(可能是cv-qualified),则再次执行重载决策,将对象视为左值.[注意:无论是否发生复制省略,都必须执行此两阶段重载决策.如果未执行elision,它将确定要调用的构造函数,并且即使调用被省略,也必须可以访问所选的构造函数. - 结束说明]
这是本书的解释 Effective Modern C++
标准祝福RVO的部分接着说,如果满足RVO的条件,但编译器选择不执行复制省略,则返回的对象必须被视为右值.实际上,标准要求在允许RVO时,发生复制省略或将std :: move隐式应用于返回的本地对象
据我所知,当返回物体最初不能被省略时,它应被视为rvalue.在这些例子中,我们可以看到,当我们传递大于5object的参数时,否则会被复制.std::move当我们知道RVO不会发生时,这是否意味着我们应该明确写出来?
#include <iostream>
#include <string>
struct Test
{
Test() {}
Test(const Test& other)
{
std::cout << "Test(const Test&)" << std::endl;
}
Test(Test&& other)
{
std::cout << "Test(const Test&&)" << std::endl;
}
};
Test foo(int param)
{
Test test1;
Test test2;
return param > 5 ? std::move(test1) : test2;
}
int main()
{
Test res = foo(2);
}
Run Code Online (Sandbox Code Playgroud)
这个程序的输出是Test(const …
c++ return-value move-semantics return-value-optimization copy-elision
#include <iostream>
#include <thread>
#include <mutex>
int main()
{
std::atomic<bool> ready = false;
std::thread threadB = std::thread([&]() {
while (!ready) {}
printf("Hello from B\n");
});
std::this_thread::sleep_for(std::chrono::seconds(1));
printf("Hello from A\n");
ready = true;
threadB.join();
printf("Hello again from A\n");
}
Run Code Online (Sandbox Code Playgroud)
这是 CppCon 演讲中的一个例子https://www.youtube.com/watch?v=F6Ipn7gCOsY&ab_channel=CppCon(17分钟)
目标是先打印Hello from A然后允许threadB开始。很明显,应该避免忙等待,因为它使用了大量的 CPU。
作者说while (!ready) {}循环可以ready由编译器优化(通过将 的值放入寄存器),因为编译器看到threadB从不睡觉所以ready永远不会改变。但是即使线程从不休眠,另一个线程仍然可以更改该值,对吗?没有数据竞争,因为它ready是原子的。作者声明这个代码是UB。有人可以解释为什么允许编译器进行这样的优化吗?
#include <iostream>
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
int main ()
{
using qi::string;
std::string input("a");
std::string::iterator strbegin = input.begin();
std::string p;
bool ok = qi::phrase_parse(strbegin, input.end(),
((string("a") >> string("a")) | string("a")),
qi::space,
p);
if (ok && strbegin == input.end()) {
std::cout << p << std::endl;
std::cout << p.size() << std::endl;
} else {
std::cout << "fail" << std::endl;
std::cout << std::string(strbegin, input.end()) << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
该计划输出aa.这怎么可能?输入字符串是a.解析器应匹配aa或a.我写的string("a")只是测试运营商.
使用时char_ …
#include <QtGui>
int main(int argc, char** argv)
{
QApplication app(argc, argv);
// first
QMessageBox box(0);
box.setText("short text");
box.setWindowTitle("looooooooooooooooong text");
box.setMinimumSize(800, 0);
box.exec();
// second
//QMessageBox::warning(0, "looooooooooooooooong text", "short text");
return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

两种方法都会产生此消息框,其中标题显示不正确。我试图调整对话框窗口小部件的大小没有帮助。如何强制QMessageBox显示整个标题?
作为一种解决方法,我可以在标题文本中添加尾随空格,但我认为应该有更好的解决方案。
aminasya@aminasya-desktop:~/qt$ qmake --version
QMake version 2.01a
Using Qt version 4.8.6 in /usr/lib/x86_64-linux-gnu
Run Code Online (Sandbox Code Playgroud) c++ ×10
qt ×3
boost ×1
boost-spirit ×1
busy-waiting ×1
copy-elision ×1
default ×1
inheritance ×1
model-view ×1
parsing ×1
protected ×1
qmessagebox ×1
qtableview ×1
resize ×1
return-value ×1
row ×1
stl ×1