- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试将 Lua 与 Qt 的 QMetaObject 系统集成。我有一个派生自 QObject
的类,我使用 QObject::staticMetaObject
根据类名绑定(bind)到 Lua。
主要.h:
#ifndef MAIN_H
#define MAIN_H
class Test : public QObject
{
Q_OBJECT
public:
Q_INVOKABLE Test(QObject *parent = 0) : QObject(parent){}
~Test(){}
};
Q_DECLARE_METATYPE(Test*)
#endif
主要.cpp
#include <QCoreApplication>
#include <QDebug>
#include "main.h"
#include "lua_src/lua.hpp" //Lua include
int CreateUserData(lua_State *L)
{
const QMetaObject *metaObject = (const QMetaObject*)lua_touserdata(L, lua_upvalueindex(1));
//PROBLEM AREA
int typeId = QMetaType::type(metaObject->className());
if(typeId != QMetaType::UnknownType)//typeId is always unknown
{
QMetaType meta(typeId);
void *ptr = lua_newuserdata(L, meta.sizeOf());
meta.construct(ptr);
}
//PROBLEM AREA
lua_newtable(L);
lua_setuservalue(L, 1);
return 1;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString luaScript("local test = Test.new()");
lua_State *L = luaL_newstate();
//bind Test class to lua
lua_newtable(L);
lua_pushvalue(L, -1);
lua_setglobal(L, "Test");
lua_pushvalue(L, -1);
lua_pushlightuserdata(L, (void*)&Test::staticMetaObject);
lua_pushcclosure(L, CreateUserData, 1);
lua_setfield(L, -2, "new");
//start script
luaL_dostring(L, luaScript.toStdString().c_str());
lua_close(L);
}
问题是 lua 会为 userdata 分配内存,但不会构造它所代表的对象。所有文档都说使用 placement new 在 lua 用户数据的 ptr
处构造对象,但是 QMetaObject
不允许开箱即用的 placement new。
我已经包含了 ixSci 关于使用 QMetaType
在 ptr
构造对象的建议。但是,typeId
返回时总是未知。
最佳答案
看起来您需要的在 QMetaType
中可用类。
所以要得到你要求的东西,你需要这样的东西(未经测试!):
int typeId = QMetaType::type(metaObject->className());
if (typeId != QMetaType::UnknownType)
{
QMetaType meta(typeId);
meta.construct(ptr, objectToCopy);
}
关于c++ - lua_newuserdata placement new 在 QMetaObject 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52091746/
我看过一些 placement new 的例子,但对各种类型内部发生的事情有点困惑。 一个简单的例子: using my_type = std::string; using buffer_
需要帮助在 Hibernate 继承中实现此场景 Cow 和 Dog 继承 Animal 类, 牛和狗都有“后代”名单 牛有额外的 list - 每月疫苗接种日期 这个 Hibernate 表示方式正
背景 我正在开发一个嵌入式 C++ 项目,在该项目中我正在使用继承构建一个简单的状态机。这个想法是每个状态都将继承自一个名为 State 的基类,状态管理器将在状态转换期间创建和销毁子类实例。为了避免
这里有没有人使用过C++的“placement new”?如果是这样,那是为了什么?在我看来,它仅在内存映射的硬件上有用。 最佳答案 新的Placement允许您在已分配的内存中构造一个对象。 当您需
我一直在阅读一些关于 placement new on SO 的问题,我发现了一些不同的使用方法,我想我会在这里问一下。我知道 placement new 基本上是您创建对象并在您选择的已分配内存中为
我正在通过以下代码学习新的 C++ 布局。 class Cell { public: Cell() { printf("default constructor by %s\n"
#include #include struct A { int a; }; struct B : virtual A { int b; }; struct C : virtual A { in
我刚刚发现了一些用 C++ 实现的容器。该类使用内部缓冲区来管理其对象。这是一个没有安全检查的简化版本: template class Container { public: Containe
是否有一种模式可以在退出范围时自动调用堆栈上 placement-new 初始化对象的析构函数?我想跳过内存显式调用析构函数的需要。或者,是否有一种不同于 placement-new 的方法来构建具有
在 Android Activity 上,我想将图像设置为左下角的背景。操作方法如下:Background Image Placement 但是,我还希望能够指定不是该图像的其余背景具有特定颜色。这可
这里有人用过C++的“placement new”吗?如果是这样,为什么?在我看来它只对内存映射硬件有用。 最佳答案 Placement new 允许您在已分配的内存中构造一个对象。 当您需要构造一个
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
假设我有一个 MyStack 类公开了: class MyStack { public: template T* Push() { Reserve(sizeof(T)); // Make s
这里有人用过C++的“placement new”吗?如果是这样,为什么?在我看来它只对内存映射硬件有用。 最佳答案 Placement new 允许您在已分配的内存中构造一个对象。 当您需要构造一个
这里有人用过C++的“placement new”吗?如果是这样,为什么?在我看来它只对内存映射硬件有用。 最佳答案 Placement new 允许您在已分配的内存中构造一个对象。 当您需要构造一个
我正在创建一个受歧视的类 union 体。我使用的是 c++ 17,所以我可以在技术上使用 std::variant,但由于特定的用例,我希望每个变体的含义更加明确(特别是因为其中两种情况没有数据,除
尝试使用 placement new 但它一直给我错误。我记得不久前,它正在工作。 g++(版本 4.8.4)在 Ubuntu 14.04 上。 #include typedef unsigned
这里有人用过C++的“placement new”吗?如果是这样,为什么?在我看来它只对内存映射硬件有用。 最佳答案 Placement new 允许您在已分配的内存中构造一个对象。 当您需要构造一个
这个问题在这里已经有了答案: What uses are there for "placement new"? (25 个答案) 关闭 8 年前。 我有两个使用new运算符分配内存的案例。 clas
我有一 block 内存区域,将用于多个队列。比如我分配了1024字节的内存,需要两个队列。第一个队列将占用前 512 个字节,第二个队列将占用接下来的 512 个字节。 但是,我的队列由 C++ 类
我是一名优秀的程序员,十分优秀!