为什么C++中的类必须声明它们的私有函数?它有实际的技术原因(它在编译时的作用是什么)还是仅仅为了一致性?
这是我目前的设置:我正在使用SDL进行OpenGL渲染(目前在Linux上).我初始化SDL(SDL_Init)并SDL_CreateWindow在主线程中创建应用程序窗口()并将其传递给第二个线程.第二个线程从it(SDL_GL_CreateContext)创建一个OpenGL上下文并启动一个渲染循环,而主线程侦听事件.我认为重要的是要注意GL调用完全局限于第二个线程; 实际上我的大多数应用程序逻辑都在那里发生,主线程实际上只负责处理通过SDL传入的事件.
最初我反过来做了这个,但事实证明你不能处理除了OSX上的主线程以及可能还有Windows之外的任何事件,所以我将其切换为将来兼容这两个.
我是否有任何担心这不适用于OSX/Windows?在Linux上,我没有任何东西.互联网上有很多关于上下文共享和从多个线程进行GL调用的信息,但我想要做的就是在一个不是主线程的线程中做OpenGL.我不想继续编写我的应用程序编码,以后发现它不会在其他地方工作.
考虑以下代码:
template<typename T>
struct MyTempl
{
virtual void doStuff(const T &value) = 0;
};
struct MyImpl : MyTempl<int>
{
void doStuff(const int &value) {}
};
struct MyPtrImpl : MyTempl<int*>
{
void doStuff(const int* &value) {}
};
MyImpl imp1;
MyPtrImpl imp2;
Run Code Online (Sandbox Code Playgroud)
这将无法正确编译:编译器告诉我doStuff()in MyPtrImpl是纯虚拟的,即.我未能正确覆盖它.但是,如果我将typedef设置int*为类似的东西int_ptr,并将其用作模板参数MyPtrImpl,那么一切都会成功.
为什么编译器在没有typedef的情况下无法扣除我的意图?
在我基于 qmake 的项目中,我想在编译之前对某些文件运行“xxd”。根据文档,我的 pro 文件中的相关部分如下所示:
SHADERS = shader/tone.frag \
shader/trans.frag \
shader/hue.frag
# xxd
xxd.output = ${QMAKE_FILE_NAME}.xxd
xxd.commands = xxd -i ${QMAKE_FILE_NAME} > ${QMAKE_FILE_OUT}
xxd.depends = SHADERS
xxd.input = $$SHADERS
xxd.variable_out = HEADERS
QMAKE_EXTRA_COMPILERS += xxd
Run Code Online (Sandbox Code Playgroud)
Qmake 不会抱怨,但它也根本不运行 xxd。我是否必须为要预处理的每个文件创建特殊目标?(生成的*.xxd文件不会被我事后编译,只包含在其他cpp文件中)
编辑:在 smokris 的帮助下,这就是我修复 pro 文件中的部分的方法:
# xxd
xxd.output = ${QMAKE_FILE_NAME}.xxd
xxd.commands = xxd -i ${QMAKE_FILE_NAME} > ${QMAKE_FILE_OUT}
xxd.depends = $$SHADERS
xxd.input = SHADERS
xxd.variable_out = HEADERS
Run Code Online (Sandbox Code Playgroud) 我很快就调试了一些东西,并编写了以下函数:
function dumpTable(t)
for i,v in pairs(t) do
if type(v) == "table" then
dumpTable(v)
else
print(i..":", v)
end
end
end
Run Code Online (Sandbox Code Playgroud)
现在,出于某种原因
dumpTable({[1]="hello??", [2]="two", {[132]="something", [3.2]="else"}})
Run Code Online (Sandbox Code Playgroud)
输出
132: something
3.2: else
2: two
Run Code Online (Sandbox Code Playgroud)
注意第一个字符串是如何丢失的?但如果我改变它的钥匙..
dumpTable({["one"]="hello??", [2]="two", {[132]="something", [3.2]="else"}})
Run Code Online (Sandbox Code Playgroud)
它输出
132: something
3.2: else
one: hello??
2: two
Run Code Online (Sandbox Code Playgroud)
这是如此不直观,我几乎觉得自己是个白痴,没有看到错误..
(顺便说一句.我知道如果表包含递归引用,我的函数将溢出堆栈,稍后将修复它)