小编ezp*_*sso的帖子

在C++中的类声明中初始化const成员

在PHP和C#中,常量可以在声明时初始化:

class Calendar3
{
    const int value1 = 12;
    const double value2 = 0.001;
}
Run Code Online (Sandbox Code Playgroud)

我有一个仿函数的以下C++声明,它与另一个类一起使用来比较两个数学向量:

struct equal_vec
{
    bool operator() (const Vector3D& a, const Vector3D& b) const
    {
        Vector3D dist = b - a;
        return ( dist.length2() <= tolerance );
    }

    static const float tolerance = 0.001;
};
Run Code Online (Sandbox Code Playgroud)

这个代码编译没有问题与g ++.现在在C++ 0x模式(-std = c ++ 0x)中,g ++编译器输出一条错误消息:

错误:'constexpr'需要对非整数类型的静态数据成员'容差'进行类内初始化

我知道我可以static const在类定义之外定义和初始化该成员.此外,可以在构造函数的初始化列表中初始化非静态常量数据成员.

但有没有办法在类声明中初始化一个常量,就像在PHP或C#中可能的那样?

更新

我使用static关键字只是因为可以在g ++中的类声明中初始化这些常量.我只需要一种方法来初始化类声明中的常量,无论它是否声明static.

c++ g++

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

如何将字符串向量内嵌到字符串中(优雅的方式)

我正在寻找最优雅的方法将字符串向量内部转换为字符串.以下是我现在使用的解决方案:

static std::string& implode(const std::vector<std::string>& elems, char delim, std::string& s)
{
    for (std::vector<std::string>::const_iterator ii = elems.begin(); ii != elems.end(); ++ii)
    {
        s += (*ii);
        if ( ii + 1 != elems.end() ) {
            s += delim;
        }
    }

    return s;
}

static std::string implode(const std::vector<std::string>& elems, char delim)
{
    std::string s;
    return implode(elems, delim, s);
}
Run Code Online (Sandbox Code Playgroud)

那里还有其他人吗?

c++ string stl stdstring implode

69
推荐指数
12
解决办法
7万
查看次数

BSTR到std :: string(std :: wstring),反之亦然

在C++中使用COM时,字符串通常是BSTR数据类型.有人可以使用BSTR包装器CComBSTR或MS CString.但是因为我不能在MinGW编译器中使用ATL或MFC,是否有标准代码片段转换BSTRstd::string(或std::wstring),反之亦然?

是否还有一些BSTR类似的非MS包装CComBSTR

更新

感谢所有以任何方式帮助过我的人!仅仅因为没有人解决过BSTR和之间的转换问题std::string,我想在此提供一些关于如何做到这一点的线索.

下面是我用转换的功能BSTR,以std::stringstd::stringBSTR分别为:

std::string ConvertBSTRToMBS(BSTR bstr)
{
    int wslen = ::SysStringLen(bstr);
    return ConvertWCSToMBS((wchar_t*)bstr, wslen);
}

std::string ConvertWCSToMBS(const wchar_t* pstr, long wslen)
{
    int len = ::WideCharToMultiByte(CP_ACP, 0, pstr, wslen, NULL, 0, NULL, NULL);

    std::string dblstr(len, '\0');
    len = ::WideCharToMultiByte(CP_ACP, 0 /* no flags */,
                                pstr, wslen /* not …
Run Code Online (Sandbox Code Playgroud)

c++ string com

63
推荐指数
3
解决办法
9万
查看次数

C中的关联数组

我正在实现一种将一组数据传输到可编程加密狗的方法.加密狗基于智能卡技术,可以在内部执行任意代码.输入和输出数据作为二进制块传递,可通过输入和输出指针访问.

我想使用关联数组来简化数据处理代码.一切都应该这样:

首先是主机应用程序:

// Host application in C++
in_data["method"] = "calc_r";
in_data["id"] = 12;
in_data["loc_a"] = 56.19;
in_data["loc_l"] = 44.02;
processor->send(in_data);
Run Code Online (Sandbox Code Playgroud)

接下来加密狗内的代码:

// Some dongle function in C
char* method_name = assoc_get_string(in_data, "method");
int id = assoc_get_int(in_data, "id");
float loc_a = assoc_get_float(in_data, "loc_a");
float loc_l = assoc_get_float(in_data, "loc_l");
Run Code Online (Sandbox Code Playgroud)

所以我的问题是关于加密狗部分的功能.是否有C代码或库来实现如上所述的关联数组行为?

c arrays associative-array dongle

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

例外和错误代码:以正确的方式混合它们

我正在开发一个C++加密狗通信库.该库将提供一个统一的接口,以与一系列远程代码执行加密狗(如SenseLock,KEYLOK,Guardant Code)进行通信.

加密狗基于智能卡技术,具有内部文件系统和RAM.

典型的操作例程包括(1)枚举连接到USB端口的加密狗,(2)连接到所选择的加密狗,(3)执行命名模块传递输入和收集输出数据.

嗯,所有这些阶段最终都会出错,这是微不足道的.可能有很多情况,但最常见的是:

  • 找不到加密狗(肯定是一个致命的案例).
  • 加密狗连接失败(致命案例).
  • 在加密狗(?)中找不到指定的执行模块.
  • 请求的操作因超时(?)而失败.
  • 请求的操作需要授权(我认为是可恢复的案例).
  • 在加密狗中执行模块时发生内存错误(肯定是致命的情况).
  • 加密狗中发生文件系统错误(肯定是致命的情况).

? - 我不知道案件是否被认为是致命的.

我仍在决定是否抛出异常,返回错误代码,或为两种情况实现方法.

问题是:

  1. 异常是否完全替换了错误代码,或者我只需要将它们用于"致命案例"?
  2. 混合两种范例(例外和错误代码)被认为是一个好主意吗?
  3. 为用户提供两种概念是否是个好主意?
  4. 混合概念的异常和错误代码是否有任何好的例子?
  5. 你会如何实现这个?

更新1.

从不同的角度看更多意见会很有意思,所以我决定在这个问题上增加100点声望.

c++ error-handling exception

25
推荐指数
6
解决办法
7400
查看次数

PHP5.将数组声明为类成员的两种方法

将数组声明为类成员时,应该采用哪种方式?

class Test1 {
    private $paths = array();

    public function __construct() {
        // some code here
    }
}
Run Code Online (Sandbox Code Playgroud)

要么

class Test2 {
    private $paths;

    public function __construct() {
        $this->paths = array();
        // some code here
    }
}
Run Code Online (Sandbox Code Playgroud)

在良好实践和绩效方面哪一个更好?你会推荐什么?

php constructor initialization class

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

JIT的竞技场总页数 - 这是什么意思?

我得到logcat输出如下:

02-12 20:06:18.515  11470-11470/? D/dalvikvm? GC_EXTERNAL_ALLOC freed 3K, 48% free 3188K/6023K, external 7949K/8580K, paused 29ms
02-12 20:06:18.804  11470-11470/? D/dalvikvm? GC_EXTERNAL_ALLOC freed <1K, 48% free 3189K/6023K, external 13255K/13400K, paused 28ms
02-12 20:06:19.406  11470-11470/? D/dalvikvm? GC_EXTERNAL_ALLOC freed <1K, 48% free 3189K/6023K, external 14706K/16754K, paused 56ms
02-12 20:06:19.914  11470-11475/? I/dalvikvm? Total arena pages for JIT: 11
Run Code Online (Sandbox Code Playgroud)

"JIT的总体竞技场页面"真正意味着什么?

java android

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

关于编组的好例子,文章和书籍

在为基于智能卡的加密狗开发软件保护库的过程中,我意识到我需要在加密狗内部的客户端应用程序和代码之间来回传输一些树状数据结构.

那么,在使用Web服务时,XML-RPC或JSON-RPC等技术是合理的考虑方式.但是,智能卡等嵌入式设备并非如此.您需要使用一些二进制格式来优化内存使用并获得良好的性能.

我想我需要的是实现一些二进制数据编组算法.我不喜欢重新发明整个轮子的想法,我非常确定有很多关于编组这类问题的书籍,文章和例子.

你会推荐什么?

UPD. 我在Linux上使用C和C++,但问题是关于编组算法的一般信息.

c c++ serialization rpc marshalling

18
推荐指数
4
解决办法
3008
查看次数

打开多个文档(项目)的应用程序的体系结构

我正在研究基于Qt的CAD应用程序,我正在试图弄清楚应用程序的架构.该应用程序能够加载包含计划,部分等的多个项目,并在专用视图中显示这些图形.每个项目和全局配置.

应用程序由全局对象表示,派生自QApplication:

class CADApplication Q_DECL_FINAL: public QApplication {
    Q_OBJECT
public:
    explicit CADApplication(int &args, char **argv);
    virtual ~CADApplication();
    ...
    ProjectManager* projectManager() const;
    ConfigManager* configManager() const;
    UndoManager*  undoManager() const;

protected:
    const QScopedPointer<ProjectManager> m_projectManager;
    const QScopedPointer<ConfigManager> m_configManager;
    ...
};
Run Code Online (Sandbox Code Playgroud)

"管理器"是在CADApplication构造函数中创建的.他们负责与加载的项目(ProjectManager),全局配置选项(ConfigManager)等相关的功能.

还有项目视图,配置选项对话框和可能需要访问"管理器"的其他对象.

为了获得当前项目,SettingsDialog需要:

#include "CADApplication.h"
#include "ProjectManager.h"
...
SettingsDialog::SettingsDialog(QWidget *parent)
: QDialog(parent)
{
    ...
    Project* project = qApp->projectManager()->currentProject();
    ...
}
Run Code Online (Sandbox Code Playgroud)

我喜欢整个方法的是它遵循RAII范式."管理者"是在applcation的实例化/销毁时创建和销毁的.

我不喜欢的是它不容易出现循环引用,并且我需要在每个源文件中包含"CADApplication.h",其中需要任何"管理器"的实例.这就像CADApplication对象被用作这些"经理"的某种全球"持有者".

我做了一些研究.似乎还有其他一些方法暗示使用单身人士.OpenToonz使用TProjectManager单例:

class DVAPI TProjectManager {
...
public:
    static …
Run Code Online (Sandbox Code Playgroud)

c++ architecture qt conceptual

16
推荐指数
2
解决办法
492
查看次数

强制枚举为unsigned long类型

是否可以强制枚举的基础类型为unsigned long类型?谢谢

c++ enums types

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