小编Ash*_*hot的帖子

无法访问派生类中受保护的成员函数地址

#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作品.能否解释为什么我们无法获得基类的受保护成员函数的地址?

c++ inheritance member-function-pointers protected

9
推荐指数
1
解决办法
1408
查看次数

stl容器是否使用隐式共享?

众所周知,Qt小部件使用隐式共享.所以我对stl容器感兴趣std::vector,也std::string使用隐式共享.

如果不是,为什么?因为它非常有用.

如果答案是肯定的,我们如何确定它?我需要简单的C++ stl程序,它表明stl容器使用隐式共享.复制时不执行深层复制.

c++ stl

8
推荐指数
2
解决办法
1917
查看次数

Qt错误:在此范围内未声明`qApp'

据我所知,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)

c++ qt

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

c ++默认赋值运算符

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)

第一个代码不编译,因为我们不能分配数组,但第二个代码.类的默认赋值运算符不是简单地为每个数据成员调用赋值吗?为什么第二个代码会编译?

c++ compiler-errors variable-assignment assignment-operator

7
推荐指数
1
解决办法
2048
查看次数

QTableView滚动到新添加的行

要向模型添加新行,我正在调用beginInsertRowsendInsertRows().如何配置视图以滚动到新添加的行并选择它.我可以通过发送一些信号来做到这一点,但也许Qt有标准的方式.

c++ qt row qtableview model-view

7
推荐指数
2
解决办法
9626
查看次数

检查是否调用了复制构造函数

我正在调试一个程序.我需要知道是否为某个类调用了复制构造函数.由于我没有定义复制构造函数,因此编译器已生成它.我试图定义它并放一些cout但现在我必须手动编写复制部分.这堂课很大,所以我不想这样做.有没有办法检查复制构造函数是否被调用,但避免写入其成员的复制.如何调用复制构造函数的默认实现?

c++ default copy-constructor

7
推荐指数
1
解决办法
1056
查看次数

在无法完成RVO的情况下,我们应该写`std :: move`吗?

众所周知,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

7
推荐指数
1
解决办法
220
查看次数

为什么允许编译器优化这个繁忙的等待循环?

#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。有人可以解释为什么允许编译器进行这样的优化吗?

c++ multithreading compiler-optimization busy-waiting

7
推荐指数
1
解决办法
153
查看次数

了解Boost.spirit的字符串解析器

#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.解析器应匹配aaa.我写的string("a")只是测试运营商.

使用时char_ …

c++ parsing boost boost-spirit boost-spirit-qi

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

QMessageBox没有显示整个标题

#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++ qt resize qmessagebox

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