小编use*_*501的帖子

什么时候应该使用static_cast,dynamic_cast,const_cast和reinterpret_cast?

有什么用途:

  • static_cast
  • dynamic_cast
  • const_cast
  • reinterpret_cast
  • C风格演员 (type)value
  • 功能式演员 type(value)

如何决定在哪些特定情况下使用哪个?

c++ pointers casting c++-faq

2367
推荐指数
9
解决办法
52万
查看次数

如何构建和安装GLFW 3并在Linux项目中使用它

GLFW3

昨晚我工作到很晚,试图从源代码构建Linux的GLFW 3软件包.这个过程花了我很长时间,总共大约3个小时,部分是因为我不熟悉CMake,部分是因为我不熟悉GLFW.

我希望这篇文章能够帮助你摆脱昨天的困难!我想我应该写一篇简短的文章,希望能为你节省几个小时的生命......

感谢#glfw IRC频道上的"urraka","b6"和"niklas",我已经能够使用glfw 3.0.1版了.

事实证明,这不是一个简单的过程(当然不适合我,我不是专家),因为网上没有太多关于glfw3的文档,尤其是关于使用CMake进行设置的文档.

我被要求将其分成问题和答案部分,所以我已经这样做了,答案部分现在在下面.

您是GLFW的维护者,还是GLFW团队的成员?

如果GLFW3的任何维护者看到这个,那么我给他们的信息是请在你的网站上添加"在Windows,Mac OS X和Linux上设置GLFW3"部分!使用GLFW编写程序非常容易,因为在线文档非常好,可以快速扫描所有可用的类和模块,然后您就可以开始了.这里展示的测试项目的例子也非常好.我发现的两个主要问题是,首先如何在我的系统上设置GLFW3,其次是如何构建GLFW3项目?对于非专家来说,这两件事可能还不够清楚.

编辑

今天简单介绍一下(日期:2014-01-14),看起来GLFW网站自从我上次查看以来已经发生了很大的变化,现在有一个关于用GLFW编译GLFW和建筑程序的部分,我认为这是新的.

linux install build cmake glfw

83
推荐指数
7
解决办法
9万
查看次数

C++ Threads,std :: system_error - 不允许操作?

所以我写了一个程序来测试64位kubuntu linux上的线程,版本13.04.实际上我从正在编写测试程序的其他人那里抢了代码.

#include <cstdlib>
#include <iostream>
#include <thread>

void task1(const std::string msg)
{
    std::cout << "task1 says: " << msg << std::endl;
}

int main(int argc, char **argv)
{
    std::thread t1(task1, "Hello");
    t1.join();

    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

我编译使用:

g++ -pthread -std=c++11 -c main.cpp
g++ main.o -o main.out
Run Code Online (Sandbox Code Playgroud)

然后跑了:

./main.out
Run Code Online (Sandbox Code Playgroud)

顺便说一下,当我使用-l'时,main.out会像所有可执行文件一样以绿色文本显示,但在其名称的末尾也有一个星号.为什么是这样?

回到手头的问题:当我运行main.out时,出现了一个错误,其中说:

terminate called after throwing an instance of 'std::system_error'
  what():  Operation not permitted
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)

任何有关如何解决此问题的想法?

c++ multithreading c++11 system-error

56
推荐指数
1
解决办法
6万
查看次数

将C++类代码分成多个文件,有哪些规则?

思考时间 - 为什么要分割文件?

正如标题所示,我遇到的最终问题是多个定义链接器错误.我实际上已经修复了问题,但我没有以正确的方式解决问题.在开始之前,我想讨论将类文件拆分成多个文件的原因.我试图把所有可能的场景放在这里 - 如果我错过任何一个,请提醒我,我可以做出改变.希望以下是正确的:

原因1 为了节省空间:

您有一个文件,其中包含所有类成员的类声明.您可以在此文件周围放置#include防护(或#pragma一次),以确保在#include包含在源文件中的两个不同头文件中的文件时不会发生冲突.您可以使用此类中声明的任何方法的实现来编译单独的源文件,因为它会从源文件中加载许多行代码,这会清除一些内容并为您的程序引入一些顺序.

示例:如您所见,可以通过将类方法的实现拆分为不同的文件来改进以下示例.(.cpp文件)

// my_class.hpp
#pragma once

class my_class
{
public:
    void my_function()
    {
        // LOTS OF CODE
        // CONFUSING TO DEBUG
        // LOTS OF CODE
        // DISORGANIZED AND DISTRACTING
        // LOTS OF CODE
        // LOOKS HORRIBLE
        // LOTS OF CODE
        // VERY MESSY
        // LOTS OF CODE
    }

    // MANY OTHER METHODS
    // MEANS VERY LARGE FILE WITH LOTS OF LINES OF CODE
}
Run Code Online (Sandbox Code Playgroud)

原因2 要防止多个定义链接器错误:

也许这就是你将实现与声明分开的主要原因.在上面的示例中,您可以将方法主体移动到类外部.这将使它看起来更清洁和结构化.但是,根据这个问题,上面的例子有隐式inline说明符.将实现从类中移动到类外部(如下例所示)将导致链接器错误,因此您可以内联所有内容,或将函数定义移动到.cpp文件. …

c++ class include

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

GLEW做了什么以及为什么需要它?

好的,所以我已经知道为什么我需要GLEW,但只有一点.

如果我使用现代OpenGL的东西,可能是从版本3.0开始,和/或使用核心配置文件,那么GLEW是必需的,因为没有它编译产生的错误,如未glGenVertexArrays声明.

所以GLEW做了一些背景工作,包括我们想要使用的现代OpenGL函数.

除此之外,还有什么其他的吗?另外,它是如何工作的.

举个例子,它是否改进了跨平台编译?(例如,如果从Linux迁移到Windows或OS X,需要对代码进行少量修改?

它是否也改善了图形硬件的"跨平台性"?例如,假设我们有两台相同的计算机,包括操作系统.在一个系统上使用OpenGL 4.3命令编译程序.如果其他系统有只支持OpenGL 3.3的显卡或驱动程序,那么GLEW会帮忙吗?(也许是为旧版OpenGL编译着色器?)

所以你可能会发现我实际上并不知道GLEW做了什么或它是如何做到的.

最后一点; 有谁知道如何使用GLEW与GLFW?我可能会将其作为一个单独的问题发布.

opengl glew opengl-3 opengl-4

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

C和C++中的易失性数组

在C中使用volatile关键字来防止编译器对变量执行某些优化以及其他细微更改.

例如;

volatile int my_int = 0;
Run Code Online (Sandbox Code Playgroud)

创建一个整数.在某些情况下,它可能会阻止以下优化:

while(my_int == 0); // Loop until my_int != 0
Run Code Online (Sandbox Code Playgroud)

优化到:

while(1); // Loop infinity.
Run Code Online (Sandbox Code Playgroud)

这对于包括嵌入式系统中经常遇到的情况很有用,例如可以通过中断函数调用对变量进行修改的情况.还有许多其他这种技术有用的例子.my_int可以是由这种功能修改的标志.(这只是一个玩具模型.)

但是,请考虑函数修改的数据是数组的情况.数据可以由指针指向.

unsigned char* my_data = new unsigned char[256];
Run Code Online (Sandbox Code Playgroud)

在这种情况下,考虑到是my_data在这个问题上的该特定情况的全局变量[1],volatile关键字冗余的,或者它仍需要?

[1]可能无关紧要.

如果答案是需要volatile关键字,那么使用正确的语法是什么?

例如,volatile unsigned char* my_data假设声明指针本身是易失性的,而不是它指向的数据.

最后,C和C++的使用有区别吗?

c c++ arrays embedded volatile

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

用boost读取json文件

我有这样一个文件:

[data.json]

{
    "electron": {
        "pos": [0,0,0],
        "vel": [0,0,0]
    },

    "proton": {
        "pos": [1,0,0],
        "vel": [0,0.1,0]
    },

     "proton": {
        "pos": [-1,0,0],
        "vel": [0,-0.1,-0.1]
    }
}
Run Code Online (Sandbox Code Playgroud)

如何通过解析此文件来创建粒子矢量.据我所知,我需要使用boost读取文件并将字符串(行)读入向量,然后解析向量的内容.

类粒子是这样的:

class Particle
{

    private:
    particle_type mtype; // particle_type is an enum
    vector<double> mPos;
    vector<double> mVel;
};
Run Code Online (Sandbox Code Playgroud)

在类中省略了get/set的其他方法.

基本上我想帮助创建一个vector<Particle>正确的位置和速度数据和解析到其中的particle_type数据.提前致谢.

代码主要:

int main(){

    boost::property_tree::ptree pt;
    boost::property_tree::read_json("data.json", pt);
}
Run Code Online (Sandbox Code Playgroud)

c++ json

20
推荐指数
3
解决办法
7万
查看次数

Gitea - 如何将默认分支名称更改回“master”

我已经安装了 Gitea,每次创建新存储库时,它都会默认主分支名称为“main”,我觉得这有点烦人。

有没有办法让它默认回到正常的“主”命名约定?如果是这样我该怎么做?

git gitea

19
推荐指数
2
解决办法
4211
查看次数

转换运算符如何返回值?

对于A类,整数转换运算符看起来像;

operator int() //Here we don't specify any return type
{
    return intValue;
}
Run Code Online (Sandbox Code Playgroud)

当上面的函数看起来没有指定返回值类型时,它是如何返回一个值的?它似乎没有返回"任何东西",但我知道它不是void.

如果未指定返回类型,这有何意义?

c++ casting operators

17
推荐指数
2
解决办法
3228
查看次数

使用同一个类中的函数在类中创建线程

我希望能够定义一个包含一些数据成员的类,以及一个可以访问那些私有数据成员的函数.

然后我想要一个公共函数,它创建一些线程,它们对类的数据成员进行操作.我在编译代码时遇到了一些麻烦.

不要担心互斥或数据保护,这不会成为问题,因为这只是一些用于测试的示例代码.

class foo {
    public:
    void make_foo_func_threads();

    private:
    void foo_func();

    char private_data;
    std::vector<std::thread> some_threads;
}

void foo::foo_func() {
    while(1) {
        private_data = 'A';
    }
}

void foo::make_foo_func_thread() {
    for(...) some_threads.push_back(std::thread(foo_func));
    for(...) some_threads.join();
}
Run Code Online (Sandbox Code Playgroud)

编译器给我错误:

'没有匹配调用std :: thread :: thread()'

显然有"用于从参数1没有已知的转换<unresolved overloaded function type>void (foo::*&&)'.

嗯,是的,我不知道这意味着什么除了编译器在理解如何解决foo_func方面有困难 - 我想.

我如何帮助编译器理解我想要做什么,所以它不会再困扰我了.毫无疑问,我写的代码是不合法的,如果是这样,有人可以解释为什么对我来说就是这种情况.谢谢!

c++ multithreading c++11

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