我一直在寻找答案,但无济于事.我的哀叹如下:
我有一个ClassA大致如下:
class ClassA : public QObject {
Q_OBJECT
public:
ClassA() { mName = "lol"; }
~ClassA();
void ShowName() { std::cout << mName << std::endl; }
std::string mName;
};
Run Code Online (Sandbox Code Playgroud)
当然,因为我使用moc,这个类实际上在我的项目中被分成cpp和hpp,但这部分不是问题.
请注意,我不会Q_DECLARE_METATYPE故意使用,因为我现在实际上并不需要它的功能(QVariant扩展).我只关心运行时实例化.
这里的问题是Q_OBJECT禁止复制和赋值构造函数.因此,我不得不适用qRegisterMetaType于ClassA自己,但ClassA*乍一看似乎工作得很好.
现在,我想在运行时从字符串动态创建此类并运行该方法ShowName().我是这样做的:
int main() {
qRegisterMetaType<ClassA*>("ClassA*");
int id = QMetaType::type("ClassA*");
std::cout << "meta id: " << id << std::endl; // Outputs correct generated user id (not 0)
ClassA* myclass = static_cast<ClassA*>(QMetaType::construct(id));
myclass->ShowName(); // Segfaults, oh …Run Code Online (Sandbox Code Playgroud) 我最近碰到了一个奇怪的问题,我在迭代多重集时得到了一个const_iterator而不是预期iterator的.事实证明这对于MSVC来说不是问题,但g ++给了我一个错误:
错误:从'const boost :: shared_ptr'类型的表达式初始化'myPtr&'类型的引用无效
相关代码:
typedef std::multiset<myPtr> myList;
myList _mystuff;
void tick(float dt)
{
for (myList::iterator i = _mystuff.begin(); i != _mystuff.end(); ++i)
{
myPtr &mine = *i; // g++ problem here, not for MSVC
// const myPtr &mine = *i; works fine for g++
mine->tick(dt);
}
}
Run Code Online (Sandbox Code Playgroud)
相当多的研究表明这是一个很多先前讨论的问题.我找到了这些相关的部分:
我对这个问题的背景知识和掌握是有限的,因此我想知道标准是否不能很好地定义这种行为,在这种情况下,g ++和MSVC可以根据自己的喜好实现行为,或者g ++或MSVC是否偏离了明确的标准.
提前致谢.
我想管理从公共容器中的共享接口类派生的一堆类对象.
为了说明这个问题,我们假设我正在构建一个包含不同演员的游戏.让我们来调用接口IActor,并获得Enemy与Civilian如此.
现在,我的想法是让我的游戏主循环能够做到这一点:
// somewhere during init
std::vector<IActor> ActorList;
Enemy EvilGuy;
Civilian CoolGuy;
ActorList.push_back(EvilGuy);
ActorList.push_back(CoolGuy);
Run Code Online (Sandbox Code Playgroud)
和
// main loop
while(!done) {
BOOST_FOREACH(IActor CurrentActor, ActorList) {
CurrentActor.Update();
CurrentActor.Draw();
}
}
Run Code Online (Sandbox Code Playgroud)
... 或类似的规定.这个例子显然不起作用,但这就是我在这里问的原因.
我想知道:在一个通用的异构容器中管理这些对象的最佳,最安全,最高级的方法是什么?我知道各种方法(Boost :: Any,void*,带有boost :: shared_ptr的处理程序类,Boost.Pointer容器,dynamic_cast)但我无法确定哪种方法可以去这里.
另外我想强调一点,我希望尽可能远离手动内存管理或嵌套指针.
非常感谢:).
基本上,我有一个通常的ListView:
Rectangle {
id: mylist
ListModel {
id: mylistModel
ListElement {
text: "blah1"
}
ListElement {
text: "blah2"
}
ListElement {
text: "blah3"
}
}
Component {
id: mylistDelegate
Text {
id: mylistDelegateText
text: text
property bool mylistDelegateTextEnabled: false
}
}
ListView {
id: mylistView
model: mylistModel
delegate: mylistDelegate
}
}
Run Code Online (Sandbox Code Playgroud)
请忽略我可能通过截断代码以关注重要内容而引入的任何问题.
无论如何,现在我的问题是我想访问ListElement的已分配委托,并查看mylistDelegateTextEnabled在javascript循环中的值.例如,这个循环迭代当前列表并给出模型中ListElements的文本:
for(var i = 0; i < mylistModel.count; ++i) {
console.log(mylistModel.get(i).text);
}
Run Code Online (Sandbox Code Playgroud)
这显然很好.
现在我想要的基本上是这样的:
for(var i = 0; i < mylistModel.count; ++i) {
console.log(mylistModel.get(i).text);
console.log(mylistModel.get(i).delegate.mylistDelegateTextEnabled);
}
Run Code Online (Sandbox Code Playgroud)
唉,它似乎并不那么容易.
帮助赞赏.
我目前的代码是:
void Sound::run() {
QFile audio_file(mResourcePath);
if(audio_file.open(QIODevice::ReadOnly)) {
audio_file.seek(44); // skip wav header
QByteArray audio_data = audio_file.readAll();
audio_file.close();
QBuffer* audio_buffer = new QBuffer(&audio_data);
qDebug() << audio_buffer->size();
QAudioFormat format;
format.setSampleSize(16);
format.setSampleRate(44100);
format.setChannelCount(2);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::UnSignedInt);
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
if (!info.isFormatSupported(format)) {
qWarning()<<"raw audio format not supported by backend, cannot play audio.";
return;
}
qDebug() << info.deviceName();
QAudioOutput* output = new QAudioOutput(info, format);
output->start(audio_buffer);
}
}
Run Code Online (Sandbox Code Playgroud)
整个过程在QThreadPool中作为QRunnable启动,该部分工作正常.问题是我从来没有得到任何音频.我的声音设备正常运行,缓冲区已满.我不知道出了什么问题.我使用app.exec().帮助赞赏.
我想用C++中的字符串重复生成所有变体,我非常喜欢非递归算法.我过去曾提出过递归算法,但由于复杂性(r ^ n),我希望看到一种迭代方法.
我很惊讶我无法在网络上或StackOverflow上的任何地方找到解决此问题的方法.
我想出了一个Python脚本,它可以做我想要的:
import itertools
variations = itertools.product('ab', repeat=4)
for variations in variations:
variation_string = ""
for letter in variations:
variation_string += letter
print variation_string
Run Code Online (Sandbox Code Playgroud)
输出:
aaaa aaab aaba aabb abaa abab abba abbb baa baab baba babb bba bbab bbba bbbb
理想情况下,我想要一个可以产生精确输出的C++程序,采用完全相同的参数.
这是出于学习目的,它不是功课.我希望我的作业就是这样.
我正在尝试序列化/反序列化游戏场景,以便网络发送/接收和从/向磁盘保存/加载.
我的游戏引擎使用节点和组件,因此这些是唯一需要序列化的对象.场景可能如下所示:
Root Node
- Node
- SpecializedComponent
- SpecializedComponent
- Node
- Node
- Node
- Node
- Node
- Node
- Node
- SpecializedComponent
- Node
Run Code Online (Sandbox Code Playgroud)
Node基本上是这样的:
class Node {
map<String, Node> mChildren;
map<String, Component> mComponents;
uuid_t mId;
Node* mParent;
};
Run Code Online (Sandbox Code Playgroud)
SpecializedComponent基本上是这样的:
class SpecializedComponent : public Component {
uuid_t mId;
Node* mNode;
};
Run Code Online (Sandbox Code Playgroud)
我想使用YAML或JSON作为我的文本表示.我有Qt,Boost和我想要的任何其他库,因此依赖性不是问题.实际上,节点已经是Q_OBJECTS所以我有反射.
尽管有反思,但将其正确地反序列化回C++树结构似乎是一个问题.
最理想的是,我想要一个优雅而有效的解决方案,将这样的结构序列化/反序列化为二进制或文本格式.
我创建了一个客户端应用程序,它使用HTTP通过简单的API与Python 2服务器通信.服务器非常广泛地使用SQLAlchemy的ORM来为这些HTTP请求提供数据.问题是即使只有很少的活动客户端,我的CPU使用率也很高.该服务器应该能够同时为每个客户端提供大约1个请求,同时为几百个客户端提供服务,因此它仍然应该是可管理的(或者我希望如此).
如何提高性能?我知道问题是ORM,因为cProfile非常清楚地表明了这一点.单个查询显然执行大约10000个Python指令,这看起来很奇怪.我尝试插入不同的数据库引擎/后端,并将解释器更改为Pypy只是为了好玩,但它显然没有帮助原始问题,也没有提高性能.
我在这做错了什么?我真的希望这是一个"好吧,呃!" 问题.
我的关系应该是不同的类型吗?渴望,懒惰,动态等?现在,我没有特别说明.
非常感谢.
我想在 actix-web 1.0 的中间件中读出正文。我正在使用闭包式中间件,使用wrap_fn.
我的基本设置是这样的:
let mut server = HttpServer::new(move || {
ActixApp::new()
.wrap_fn(|req, srv| {
srv.call(req).map(|res| {
let req_ = res.request();
let body = req_.magical_body_read_function();
dbg!(body);
res
})
})
});
Run Code Online (Sandbox Code Playgroud)
我需要那个magical_body_read_function()可悲的是不存在的东西。
我通过阅读示例和使用将一些看起来可以工作的东西拼凑在一起take_payload(),但遗憾的是它没有工作:
let mut server = HttpServer::new(move || {
ActixApp::new()
.wrap_fn(|req, srv| {
srv.call(req).map(|res| {
let req_ = res.request();
req_.take_payload()
.fold(BytesMut::new(), move |mut body, chunk| {
body.extend_from_slice(&chunk);
Ok::<_, PayloadError>(body)
})
.and_then(|bytes| {
info!("request body: {:?}", bytes);
});
res
})
})
});
Run Code Online (Sandbox Code Playgroud)
给我
error[E0599]: …Run Code Online (Sandbox Code Playgroud) 我想在X11中捕获每个鼠标单击事件并将它们传递给我的C++应用程序.我不仅希望捕获在主窗口顶部进行的点击,而且每次都不考虑我的主窗口.看起来我可以使用XGrabPointer轻松完成此任务.但是,我希望一切都表现得好像我从未抓住过这个事件.也就是说,我希望事件能够继续他们在层次结构中的其他客户的正常旅程,我只想成为第一个窥探事件的人.我不希望这些事件被"吃掉".
谷歌搜索问题似乎有一些解决方案,但显然所有这些解决方案都已被破坏或弃用.最有希望的是Xrecord + Xtest,但这似乎也被弃用了.
看起来现在应该使用Xinput2来完成,但是如何使用它的信息真的很少.我很欣赏一些见解.
编辑:我仍然喜欢这个答案!
c++ ×7
qt ×3
actix-web ×1
algorithm ×1
audio ×1
containers ×1
g++ ×1
input ×1
interface ×1
javascript ×1
linux ×1
middleware ×1
mouse ×1
permutation ×1
python ×1
qml ×1
reflection ×1
rust ×1
sql ×1
sqlalchemy ×1
standards ×1
tree ×1
visual-c++ ×1
x11 ×1