我有一个std::vector<int>
指针指向int*
向量中的元素.假设指针指向第三个元素:pointer=&vector.at(2)
.如果我现在对矢量进行混洗,它是否仍然指向相同的元素(第三个),还是它指向新的位置,而这个元素曾经是第三个元素现在已经移动了?
在那之后,我想让问题更加通用:当向量扩展或缩小时,向量中元素的指针和迭代器如何表现?
试图确定以下C风格代码的"现代"实现:
#define logError(...) log(__FILE__, __LINE__, __VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)
有可能使用可变参数模板或不依赖于类似的类似物来捕获它#define
吗?
期望的用例:
logError( "Oh no! An error occurred!" );
Run Code Online (Sandbox Code Playgroud)
在哪里__FILE__
,并__LINE__
在引擎盖下捕获,但反映了logError
从哪里调用的文件名和行号.
我正在为 GUI 开发跟踪窗口。我在 QML 端使用 TableView 元素来显示将不断更新的数据。我怎样才能用数据填充这个元素?元素的数量以及每个元素的数据每隔几毫秒就会发生变化。
我认为信号/插槽实现将是理想的,当数据发生变化时,产生一个信号来触发插槽函数来更新 TableView 中显示的值?沿着这些路线的东西。
提前致谢!
import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1
import QtQuick.Dialogs 1.1
import QtQuick 2.1
....
TableView {
anchors.fill: parent
id: traceTable
//table data comes from a model
model: traceTableModel
//Component.onCompleted: classInstance.popAndDisplayMsg(classInstance)
TableViewColumn { role: "index"; title: "Index"; width: 0.25 * mainWindow.width; }
TableViewColumn { role: "type"; title: "Type"; width: 0.25 * mainWindow.width; }
TableViewColumn { role: "uid"; title: "ID"; width: 0.25 * mainWindow.width; }
TableViewColumn { role: "timestamp"; title: "Timestamp"; …
Run Code Online (Sandbox Code Playgroud) 我想避免使用qmake
和.pro
文件。问题是我无法cmake
与很好地合作Qt Plugins
。我已经包含了下面的代码,这些代码显示了界面,插件和加载程序,它们对于给定的.pro
文件均能正常工作,但是我无法弄清楚如何将此功能转移到cmake
。
加载程序已知的纯虚拟接口。
#include <QtCore/qglobal.h>
class HelloPluginInterface
{
public:
virtual void DoSomething() const = 0;
};
Q_DECLARE_INTERFACE( HelloPluginInterface, "com.harbrick.Qt.HelloPluginInterface")
Run Code Online (Sandbox Code Playgroud)
成为.so
加载程序要加载的插件。
#include <QtPlugin>
#include "helloplugin_global.h"
class HelloPlugin : public QObject, public HelloPluginInterface
{
Q_OBJECT
Q_PLUGIN_METADATA( IID "com.harbrick.Qt.HelloPluginInterface" )
Q_INTERFACES( HelloPluginInterface )
public:
void DoSomething() const;
};
Run Code Online (Sandbox Code Playgroud)
void MainWindow::LoadPlugin( const QString& pathToLibrary )
{
QPluginLoader loader( pathToLibrary );
QObject* instance = loader.instance();
if( instance ) …
Run Code Online (Sandbox Code Playgroud) 假设我有以下类:(可能是元生成的)
class MyClass
{
public:
myMethod();
...
}
Run Code Online (Sandbox Code Playgroud)
假设这里有一些事情:
1.) I have the class name from somewhere (let's pretend)
2.) I have the names of the class methods somewhere ( std::map< std::string, std::function> ... perhaps? )
Run Code Online (Sandbox Code Playgroud)
所以...因为我可能不知道myMethod()
运行时的名称,有没有办法用它来调用它std::string
?这假设我有一个存储在某处的类函数的名称.
MyClass example;
std::string funcName{ findMyMethod() };//get std::string name of myMethod
example.someHowRunMyMethodUsing_funcName_();
Run Code Online (Sandbox Code Playgroud)
我知道C++通常不适合类似内省的情况,但我想弄明白这一点.
谢谢!
我有一些包含在C++应用程序中的C代码,这里的重要部分是:
C代码
ifdef __cplusplus
extern "C" {
endif
...
typedef void* problem_type;
...
int problematic_fn_proto( const problem_type const arg );
ifdef __cplusplus
}
endif
Run Code Online (Sandbox Code Playgroud)
不幸的是,由于duplicate 'const'
错误,这将无法编译.这typedef
是导致问题的原因.如果我只是将函数的原型更改为:
int problematic_fn_proto( const void* const arg );
Run Code Online (Sandbox Code Playgroud)
没有更多的问题.不幸的是,我无法删除typedef
.这里有解决方案吗?我可以对C部分进行其他更改,但是typedef和它作为函数的参数必须保留.
试图从QMdiSubWindow中删除Qt图标但收效甚微.下面是一张显示左上角图标的图片.
这是一些代码,似乎应该将Icon设置为空,但不是.
QMdiSubWindow* sub = new QMdiSubWindow;
sub->setAttribute( Qt::WA_DeleteOnClose );
sub->setWidget( myWidget );
sub->setWindowIcon( QIcon() );
//tried this too
//sub->setWindowIcon( QIcon("") );
mdiArea->addSubWindow( traceSub );
Run Code Online (Sandbox Code Playgroud)
谢谢!
我正在使用正则表达式来识别C中的变量声明,我已经得到了这个.
[a-zA-Z_][a-zA-Z0-9]*
Run Code Online (Sandbox Code Playgroud)
有没有更好的解决方案?
我有TableView
连接的Qml 2.0控件QAbstractItemModel
.我想创建一个可以更改属性的上下文菜单,或者只是从模型中调用具体对象的方法.
例:
QAbstractItemModel
有一个std::vector<Person>
.Person
有一个方法alter()
可以做一些改变(任何改变,哪些改变都无关紧要,重点是我们能够调用该方法).
右键单击该行时,菜单会显示一个项目Alter
.
我能找到的就是如何制作菜单.
rowDelegate: Item {
Menu {
id: myContextMenu
MenuItem {text: "Alter"; onTriggered: {} }
}
MouseArea {
id: longPressArea
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton
onClicked: {
if (mouse.button == Qt.RightButton)
myContextMenu.popup()
}
}
}
Run Code Online (Sandbox Code Playgroud)
但我仍然不知道如何将菜单与行的确切对象连接起来.
我以a的形式从函数返回三个项目std::tuple
.
... myFunction()
{
...
return std::tuple< int, unsigned long long, unsigned int >{ errorCode, timeStamp, sizeOfBuffer };
}
Run Code Online (Sandbox Code Playgroud)
由于必须使用std::get
或访问返回值std::tie
,编译器是否针对未使用的值进行优化(g ++ 4.8)?
我需要以二进制模式读取文件并将字节作为十六进制值存储在任何STL容器中(最好是std :: list).后来我需要将它们写回文件,也是二进制模式.所以,我宣布,
typedef unsigned char BYTE;
std::ifstream File("File_Name", std::ios::binary);
std::list<BYTE> File_Bytes;
Run Code Online (Sandbox Code Playgroud)
通过所有的搜索,我理解了一些事情.可以使用std :: istream :: read()或std :: istreambuf_iterator进行读取(我可能非常错误.请纠正我.)而read()函数只将char*作为内存中存储字节的参数输入流的大小.
如果我必须将文件中的字节读入BYTE列表并再次使用istream和ostream分别从BYTE列表写入文件,我将如何执行此操作?请为我澄清一下.谢谢.
注意:这实际上是用于霍夫曼编码器/解码器,我需要在程序内部压缩和解压缩,并将解压缩的位写为输出文件.这是为了验证压缩的无损性和程序的正确性.另外,任何人都可以告诉我如何将编码的二进制位写入文件以及编码的Huffman文件具有哪些文件扩展名?非常感谢你.
我有以下代码正常运行.
if((strcmppgm2ram((char*)name, (ROM char*)"products.htm") != 0))
{
if((strcmppgm2ram((char*)name, (ROM char*)"restock.htm") != 0))
{
return HTTP_IO_DONE;
}
}
Run Code Online (Sandbox Code Playgroud)
我想清理它并把它放在表格中:
if((strcmppgm2ram((char*)name, (ROM char*)"products.htm") != 0) || (strcmppgm2ram((char*)name, (ROM char*)"restock.htm") !=0))
{
return HTTP_IO_DONE;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,后者无法正常工作.有什么我忽略了?提前致谢!为了这个问题,PS strcmp == strcmppgm2ram.
说我有两个功能:
fn function_with_one_argument(one: i64) -> bool{
one==one // irrelevant
}
fn function_with_two_arguments(one: i64, two: i64) -> bool {
one==two // irrelevant
}
Run Code Online (Sandbox Code Playgroud)
给定不同的输入值,我想返回一个不同的函数指针:
fn main() {
println!("\n\n{:?}\n\n", get_function_pointer(1)(321));
println!("{:?}", get_function_pointer(2)(321/*, 321*/));
}
Run Code Online (Sandbox Code Playgroud)
如何表示返回值以返回指向不同形状函数的指针?
fn get_function_pointer(id: i64) -> /***/(fn(i64) -> bool)/***/ {
match id {
1 => function_with_one_argument,
// 2 => function_with_two_arguments, /*How do we make this work?*?
_ => panic!("!?!?!")
}
}
Run Code Online (Sandbox Code Playgroud)