这个例子怎么可能有效呢?它打印6:
#include <iostream>
#include <functional>
using namespace std;
void scopeIt(std::function<int()> &fun) {
int val = 6;
fun = [=](){return val;}; //<-- this
}
int main() {
std::function<int()> fun;
scopeIt(fun);
cout << fun();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
完成调用6后存储的值在哪里scopeIt?如果我[=]用a 替换[&]它,它打印0而不是6.
我做过一些像:
FILE* a = fopen("a.txt", "w");
const char* data = "abc123";
fwrite(data, 6, 1, a);
fclose(a);
Run Code Online (Sandbox Code Playgroud)
然后在生成的文本文件中,它就像预期的那样说"abc123".但后来我做了:
//this time it is "wb" not just "w"
FILE* a = fopen("a.txt", "wb");
const char* data = "abc123";
fwrite(data, 6, 1, a);
fclose(a);
Run Code Online (Sandbox Code Playgroud)
并获得完全相同的结果.如果我使用二进制或普通模式读取文件,它也会给我相同的结果.所以我的问题是,有或没有二进制模式的fopening有什么区别.
我在哪里读到有关fopen模式的信息:http://www.cplusplus.com/reference/cstdio/fopen/
假设我将光标位置放在右侧大括号的右侧,如下所示:

现在,如果我按回车键,我希望它将光标自动对齐两个标签,就像break声明一样.但它的作用是:

它增加了一个荒谬的五个标签!知道Visual Studio有一公吨的设置,我导航到Tools::Settings::Text Editor::C/C++::Formatting::Indentation,并看到以下窗口:

但是,更改任何组合中突出显示的选项实际上并不会影响缩进!似乎没有其他选项适用于switch语句,所以我不知道该怎么做.如何在不禁用自动格式化的情况下使其缩进5个空格?
我可以补充说,当我在大括号的末尾按Enter时,它不仅会放置5个标签,而且会发生任何自动格式化事件.因此,当我在一行的末尾添加一个分号时,即使我之前将它们取出,它也会放置5个标签.
我可以看到发送的websocket数据包是什么,但如果它们是二进制的,则不会包含它们包含的内容.

有什么方法可以使用Chrome来查看这些数据包的内容是什么?
我需要在3D环境中实现“选择对象”。因此,我决定采用简单的方法,而不是采用健壮,准确的方法(例如光线投射)。首先,我将对象的世界位置转换为屏幕坐标:
glm::mat4 modelView, projection, accum;
glGetFloatv(GL_PROJECTION_MATRIX, (GLfloat*)&projection);
glGetFloatv(GL_MODELVIEW_MATRIX, (GLfloat*)&modelView);
accum = projection * modelView;
glm::mat4 transformed = accum * glm::vec4(objectLocation, 1);
Run Code Online (Sandbox Code Playgroud)
随后是一些琐碎的代码,可将opengl坐标系转换为普通窗口坐标,并与鼠标进行简单的距离检查。但是效果不佳。为了从世界空间转换为屏幕空间,我需要在上面显示的函数的末尾再添加一个计算:
transformed.x /= transformed.z;
transformed.y /= transformed.z;
Run Code Online (Sandbox Code Playgroud)
我不明白为什么我必须这样做。我的印象是,一旦将您的顶点乘以累积的modelViewProjection矩阵,便得到了屏幕坐标。但是我必须除以Z才能使其正常工作。在我的openGL 3.3着色器中,我不必除以Z。这是为什么?
编辑:从opengl坐标系转换到屏幕坐标的代码是这样的:
int screenX = (int)((trans.x + 1.f)*640.f); //640 = 1280/2
int screenY = (int)((-trans.y + 1.f)*360.f); //360 = 720/2
Run Code Online (Sandbox Code Playgroud)
然后通过执行以下操作来测试鼠标是否在该点附近:
float length = glm::distance(glm::vec2(screenX, screenY), glm::vec2(mouseX, mouseY));
if(length < 50) {//you can guess the rest
Run Code Online (Sandbox Code Playgroud)
编辑#2
在鼠标单击事件后调用此方法:
glm::mat4 modelView;
glm::mat4 projection;
glm::mat4 accum;
glGetFloatv(GL_PROJECTION_MATRIX, (GLfloat*)&projection);
glGetFloatv(GL_MODELVIEW_MATRIX, (GLfloat*)&modelView);
accum …Run Code Online (Sandbox Code Playgroud) 在创建指针时,我总是把这样的星号写成:
//directly adjacent to the type
int* p = new int();
Run Code Online (Sandbox Code Playgroud)
因此,我不会将声明与dererefence混淆.但后来我学到了这个:
//p is a pointer, q is an int
int* p, q;
Run Code Online (Sandbox Code Playgroud)
这对我有误导性,所以我开始把星号放在变量旁边,而不是类型.但是,这让我思考.他们为什么这样设计呢?以这种方式思考它可能很糟糕,但我一直认为指针是该类型的一部分.就像,它不是指向int的指针,它是一个int指针.我知道它实际上不是那样的,但它总是在我的脑海中流动得更好.真正让我思考的是,为什么括号走了:
//after the variable
int p[1];
Run Code Online (Sandbox Code Playgroud)
tldr; 为什么星号位于变量前面,但后面是括号
unique_ptr本质上不是与对象的直接实例相同吗?我的意思是,动态继承和性能存在一些差异,但仅此而已unique_ptr吗?
考虑此代码以了解我的意思。这不是:
#include <iostream>
#include <memory>
using namespace std;
void print(int a) {
cout << a << "\n";
}
int main()
{
unique_ptr<int> a(new int);
print(*a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
几乎完全一样:
#include <iostream>
#include <memory>
using namespace std;
void print(int a) {
cout << a << "\n";
}
int main()
{
int a;
print(a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
还是我误解了unique_ptr应该用于什么?
所以我知道不允许使用具有相同参数和名称的函数:
int a(int b) {
return b;
}
int a(int b) {
return b;
}
int main() {
int c = a(4);
}
Run Code Online (Sandbox Code Playgroud)
以上内容不会编译.但后来我开始思考,如果我通过引用传递一个,然后按值传递一个怎么办?
int a(int b) {
return b;
}
int a(int& b) {
return b;
}
int main() {
int c = a(4);
}
Run Code Online (Sandbox Code Playgroud)
上面的编译,我猜是因为你不能通过4引用传递,所以它假设你想要第一个a,这意味着编译器可以区分你想要调用的函数.如果我main改为这个:
int main() {
int c = a(4);
a(c);
}
Run Code Online (Sandbox Code Playgroud)
它将无法编译,我假设因为c可以传递给任一函数,所以编译器不知道要调用哪个函数.
那怎么样......这个?
int a(const int& b) {
return b;
}
int a(int& b) {
return b; …Run Code Online (Sandbox Code Playgroud) 这是我的问题,我说我有一个函数,它由以下内容组成:
void function() {
entity e; //entity is just a class
entities.push_back(e); //entities is a vector of entity objects
}
Run Code Online (Sandbox Code Playgroud)
这有什么麻烦我.'e'包含指向另一个对象的指针.当调用实体的析构函数时,它会删除该指针.由于'e'和实体中的实体都指向同一个地方,如果我对来自实体的指针执行某些操作(在函数外部)它会产生错误,因为只要函数删除指针就会被删除回.解决这个问题的最佳方法是什么?