小编BWG*_*BWG的帖子

lambda捕获的变量存储在哪里?

这个例子怎么可能有效呢?它打印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.

c++ memory lambda

25
推荐指数
3
解决办法
3113
查看次数

打开二进制文件与文本之间的区别

我做过一些像:

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/

c++ binary text file

9
推荐指数
2
解决办法
1万
查看次数

switch语句的格式

假设我将光标位置放在右侧大括号的右侧,如下所示:

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

但是,更改任何组合中突出显示的选项实际上并不会影响缩进!似乎没有其他选项适用于switch语句,所以我不知道该怎么做.如何在不禁用自动格式化的情况下使其缩进5个空格?

我可以补充说,当我在大括号的末尾按Enter时,它不仅会放置5个标签,而且会发生任何自动格式化事件.因此,当我在一行的末尾添加一个分号时,即使我之前将它们取出,它也会放置5个标签.

c++ indentation visual-studio-2013

8
推荐指数
1
解决办法
4633
查看次数

查看chrome中的二进制websocket有效负载?

我可以看到发送的websocket数据包是什么,但如果它们是二进制的,则不会包含它们包含的内容.

这个

有什么方法可以使用Chrome来查看这些数据包的内容是什么?

binary google-chrome websocket

8
推荐指数
0
解决办法
572
查看次数

为什么我必须除以Z?

我需要在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)

c++ opengl matrix-multiplication

5
推荐指数
1
解决办法
819
查看次数

放置[]和*

在创建指针时,我总是把这样的星号写成:

//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; 为什么星号位于变量前面,但后面是括号

c pointers

3
推荐指数
1
解决办法
130
查看次数

unique_ptr 的意义何在?

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应该用于什么?

memory pointers unique-ptr c++11

3
推荐指数
2
解决办法
1184
查看次数

为什么允许这样做?

所以我知道不允许使用具有相同参数和名称的函数:

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)

c++ overloading const reference

2
推荐指数
1
解决办法
71
查看次数

析构函数调用和指针

这是我的问题,我说我有一个函数,它由以下内容组成:

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'和实体中的实体都指向同一个地方,如果我对来自实体的指针执行某些操作(在函数外部)它会产生错误,因为只要函数删除指针就会被删除回.解决这个问题的最佳方法是什么?

c++

1
推荐指数
1
解决办法
800
查看次数