相关疑难解决方法(0)

在编译时用C++生成随机数

我正在尝试random在编译时使用C++ 11的库预先计算随机值.我主要是按照例子.我在这做错了什么?

using namespace std;
#include <iostream>
#include <vector>
#include <random>

vector<double> rands;
typedef std::mt19937_64 RNG;
uint64_t seed_val;
RNG rng; 

void initialize() {
     rng.seed(seed_val);
}

constexpr vector<double> generate_random( )                 //size_t numbers)
{   
    int numbers = 1000;
    std::uniform_real_distribution<double> zero_one(0.0, 1.0);
        for (unsigned int i = 0; i < numbers; i++) { 
             double rand_num = zero_one(rng);
             rands.push_back( rand_num );
    }
    return rands;
}

int main()
{
    cout << "TMP rands";
    for_each( rands.begin(), rands.end(), [] (double value)
    {
        cout<<value<<endl;
    });
} …
Run Code Online (Sandbox Code Playgroud)

c++ random template-meta-programming c++11

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

在C++中过度使用`this`

我正在处理一个大型代码库,它始终使用以下构造

class MyClass
{
public:
  void f(int x);
private:
  int x;
};


void MyClass::f(int x)
{
'
'
  this->x = x;
'
'
}
Run Code Online (Sandbox Code Playgroud)

就个人而言,我总是使用,因此更喜欢这种形式

class MyClass
{
public:
  void f(int x);
private:
  int _x;
};


void MyClass::f(int x)
{
'
'
  _x = x;
'
'
}
Run Code Online (Sandbox Code Playgroud)

我更喜欢后者的原因是它更简洁(更少的代码=更少的潜在错误),并且我不喜欢在范围内同时拥有多个同名的变量,我可以避免它.也就是说,我现在越来越多地看到以前的用法.我不知道第二种方法有什么好处吗?(例如,对编译时的影响,使用模板化代码等等)两种方法的优点是否足够重要,另一方面是否重构?我要问的原因是,虽然我不喜欢代码中存在的第二种方法,但是引入更多错误的工作量和相关风险并不值得重构.

c++ refactoring this

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

_函数名称中的下划线

在许多具有简单OO功能(PHP 4)或误解OO功能(使用函数指针等的Javascript,C)的语言中,您最终会得到一个使用前导下划线来表示权限级别的函数命名约定.

//ex.
function _myPrivateFunction(){
}   
Run Code Online (Sandbox Code Playgroud)

虽然各个团队总是会提出这样的命名惯例,但是下划线惯例看起来如此普遍,以至于让我很好奇

  1. 技术最初的来源
  2. 如果围绕公约制定了任何标准化系统(有点像匈牙利符号)

除了纯粹的好奇心之外,我在一些我正在处理的代码库中看到了这一点,并且我想了解最初提出它的开发人员可能的顶空.

javascript php oop history naming-conventions

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

什么是在C++中返回错误代码的正确方法

我正在使用错误代码来处理我的c ++项目中的错误.问题是如何从一个应该返回一些变量/对象的函数返回错误代码.

考虑一下:

long val = myobject.doSomething();
Run Code Online (Sandbox Code Playgroud)

在这里,myobject是某个类的对象.如果doSomething函数遇到某些错误条件,那么它应该如何通知调用者(不使用异常).

可能的解决方案:

  1. 在类中有一个数据成员(比如err_),可以由调用者检查.但是,在共享同一个对象并调用相同函数的多线程应用程序中,这将是不安全的.
  2. 使用一些全局错误变量,在多线程环境中也是同样的问题.

现在如何通知调用者一些错误情况?

c++

22
推荐指数
5
解决办法
3万
查看次数

命名包括警卫

C++如何包含通常命名的守卫?我倾向于看到这么多:

#ifndef FOO_H
#define FOO_H

// ...

#endif
Run Code Online (Sandbox Code Playgroud)

但是,我认为这不是很直观.如果没有看到文件名,就很难分辨出它的含义FOO_H和名称所指的含义.

什么是最佳做法?

c++ include-guards c-preprocessor

22
推荐指数
4
解决办法
1万
查看次数

矢量不是模板?

我目前正在尝试按照教程为自上而下的RPG制作一个简单的2D磁贴引擎.出于某种原因,虽然我得到了智能感知错误

vector is not a template

"向量"一词用红色加下划线.为什么这不起作用?为什么它告诉我它是一个模板,为什么程序不起作用?

#ifndef _IMAGEMANAGER_H
#define _IMAGEMANAGER_H

#include <vector>
#include <SFML\Graphics.hpp>

class ImageManager
{
private:
    vector<sf::Texture> textureList;

public:
    ImageManager();
    ~ImageManager();

    void AddTexture(sf::Texture& texture);
    sf::Texture& GetTexture(int index);
};
#endif
Run Code Online (Sandbox Code Playgroud)

我得到的错误(毫无疑问,其中一些错误来自上面这部分的错误):

  • 错误1错误C2143:语法错误:缺少';' 在'<'c:\ users\vipar\dropbox\computer science\programming\visual studio 2012\projects\sfml-app\sfml-app\imagemanager.h 10 1 sfml-app

  • 错误2错误C4430:缺少类型说明符 - 假定为int.注意:C++不支持default-int c:\ users\vipar\dropbox\computer
    science\programming\visual studio
    2012\projects\sfml-app\sfml-app\imagemanager.h 10 1 sfml-app

  • 错误3错误C2238:';'之前的意外令牌 c:\ users\vipar\dropbox\computer science\programming\visual studio 2012\projects\sfml-app\sfml-app\imagemanager.h 10 1 sfml-app

  • 错误4错误C2143:语法错误:缺少';' 在'<'c:\ users\vipar\dropbox\computer science\programming\visual studio 2012\projects\sfml-app\sfml-app\imagemanager.h 10 1 sfml-app

  • 错误5错误C4430:缺少类型说明符 - 假定为int.注意:C++不支持default-int c:\ users\vipar\dropbox\computer
    science\programming\visual studio
    2012\projects\sfml-app\sfml-app\imagemanager.h 10 …

c++ vector sfml

22
推荐指数
2
解决办法
4万
查看次数

什么是C#的readonly字段修饰符的C++等价物?

锁定状态很棒.在C#中,一旦构造函数通过声明为完成,就可以确保字段不会更改它的值/引用readonly.

class Foo
{
    private readonly string _foo;

    public Foo() {
        _foo = "Unchangeable";
    }

    public void ChangeIt() {
        _foo = "Darn";        // compiler error
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以用C++做同样的事情吗?如果是这样,怎么样?如果没有,为什么不呢?

c++ field readonly immutability

21
推荐指数
4
解决办法
1万
查看次数

#include标头保护格式?

我知道这对项目没有什么影响,但是,假设您使用#defined标头保护C++代码,您使用什么格式?例如假设一个标题foo.hpp:

#ifndef __FOO_HPP__
...

#ifndef INCLUDED_FOO_HPP
...

#ifndef SOME_OTHER_FORMAT
Run Code Online (Sandbox Code Playgroud)

我卖的是关于大写#defines的想法,但不能解决这些守卫的格式.

c++ header c-preprocessor

20
推荐指数
5
解决办法
9258
查看次数

如何确保方法只在该对象的生命周期内执行一次?

class MyObj{
public:
    void myFunc(){
         //ToBeExecutedJustOnce
    }

};
Run Code Online (Sandbox Code Playgroud)

我有一个函数,我想在生命周期中只执行一次MyObj.可能有许多实例MyObj,并且每个实例应该能够执行一次该功能.所以,如果我有:

MyObj first;
MyObj second;
MyObj third:
first.myFunc(); // Should execute
second.myFunc(); // Should execute
third.myFunc(); // Should execute
first.myFunc(); // Should not execute
second.myFunc(); // Should not execute
third.myFunc(); // Should not execute
Run Code Online (Sandbox Code Playgroud)

选项:

  1. 成员变量:如果我使用成员变量,那么其中的其他函数MyObj可以访问它并更改它.
  2. 全局静态变量:无法工作,因为第一个,第二个和第三个都将检查相同的变量.
  3. local static:与#2相同的问题.

我找到的唯一解决方案是MyObj从另一个类继承

MyOtherObj{
private:
    bool _isInit = false;
public:
    bool isInit(){
          bool ret = true;
          if (!_isInit){
              ret = false;
              _isInit = true;
          }
          return ret; …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

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

下划线在typedef结构中意味着什么?

我正在阅读zmq的源代码,并遇到了以下内容 typedef

typedef struct {unsigned char _ [32];} zmq_msg_t;
Run Code Online (Sandbox Code Playgroud)

我不明白下划线在这个定义中意味着什么.有人可以帮忙解决一些问题吗?

c c++ typedef structure

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