小编ban*_*a36的帖子

为什么不通过右值引用接受 std::unique_ptr ?

有人可以解释为什么每个人都std::unique_ptr按值传递而不是按右值引用传递吗?

据我观察,这需要调用额外的移动构造函数。

这是一个持有“指针”的类的示例。需要 3 个 move-ctor 调用才能按值获取它,而需要 2 个调用才能按引用获取它:

#include <memory>
#include <iostream>

class pointer {
public:
    pointer()
    { std::cerr << "ctor" << std::endl; }
    
    pointer(const pointer&)
    { std::cerr << "copy-ctor" << std::endl; }
    
    pointer& operator=(const pointer&)
    { std::cerr << "copy-assignment" << std::endl; return *this; }
    
    pointer(pointer&&)
    { std::cerr << "move-ctor" << std::endl; }
    
    pointer& operator=(pointer&&)
    { std::cerr << "move-assignment" << std::endl; return *this; }
    
    ~pointer()
    { std::cerr << "dtor" << std::endl; }
};

class A {
public: …
Run Code Online (Sandbox Code Playgroud)

c++

6
推荐指数
2
解决办法
2468
查看次数

没有什么可以帮助解决 Qt 中的“对 vtable 的未定义引用”

我无法构建此错误“未定义对 CustomUndoStack 的 vtable 的引用”

这是代码:

class CustomUndoStack : public QObject
{
    Q_OBJECT

public:

};


int main(int argc, char *argv[])
{
    QCoreApplication qCoreApplication(argc, argv);

    CustomUndoStack uStack;

    return qCoreApplication.exec();
}
Run Code Online (Sandbox Code Playgroud)

这是 .pro 文件:

QT += widgets

CONFIG += c++14 console
CONFIG -= app_bundle

DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += main.cpp
Run Code Online (Sandbox Code Playgroud)

我已经手动删除了构建目录,我已经以所有可能的方式尝试了“全部清理”和“重新构建全部”,我已经运行了 qmake 100500 次,我已经更改了 CustomUndoStack 界面超过 9000 次,但没有任何帮助。

问题出在哪里?

UPD 回答评论:如果我删除 Q_OBJECT 行,那么我就不能这样做。它说“没有这样的信号 QObject::undoSignal()”

class CustomUndoStack : public QObject
{
//    Q_OBJECT

public:
    CustomUndoStack() {
        connect(this, SIGNAL(undo_signal()), &undoStack, SLOT(undo()));
    }
signals: …
Run Code Online (Sandbox Code Playgroud)

qt vtable qobject

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

ShellExecuteEx不传递长命令

当我使用带有这样一个命令的ShellExecuteEx时,"-unused parameter -action capturescreenshot -filename C:\\ATDK\\Screenshots\\abcd.jbg"一切正常,Executor.exe以char* argv[]所有大约开始.9个参数.但是当命令有更多符号时,例如文件名是"abc ... xyz.jpg",那么该进程有argc == 1且命令为空.所以在发送到ShellExecute之前命令没问题我将其更改为ShellExecute,而不是Ex,它可以工作!命令可能很长,并且成功通过.任何人都能解释一下有什么区别吗?这是我填写SHELLEXECUTEINFO的代码.

std::wstringstream wss;
wss << L"-unused" << " "    // added because we need to pass some info as 0 parameter
    << L"parameter" << " "  // added because EU parser sucks
    << L"-action" << " "
    << L"capturescreenshot" << " "
    << L"-filename" << " "
    << L"C:\\ATDK\\Screenshots\\abc.jpg";

SHELLEXECUTEINFO shell_info;
ZeroMemory(&shell_info, sizeof(shell_info));

shell_info.cbSize = sizeof(SHELLEXECUTEINFO);
shell_info.fMask = SEE_MASK_ASYNCOK | SEE_MASK_NO_CONSOLE;
shell_info.hwnd = NULL;
shell_info.lpVerb = …
Run Code Online (Sandbox Code Playgroud)

c++ windows winapi

0
推荐指数
1
解决办法
201
查看次数

标签 统计

c++ ×2

qobject ×1

qt ×1

vtable ×1

winapi ×1

windows ×1