javascript

git

java

python

git-remote

c++

github

django

c#

reactjs

variables

var

loops

iteration

std

c++-faq

git-checkout

generator

coroutine

spring-mvc

c ++节俭与协议缓冲区

这个问题已经在这里有了答案:

  • Thrift与协议缓冲区的最大区别? 14个答案

我使用PB已经有一段时间了,但是Thrift一直是我的后脑。

如我所见,节俭的主要优点是:

  1. 与PB重复的本机集合(即矢量,集合等)与PB相似,但功能不尽相同(没有迭代器,除非您深入研究RepeatedField,文档指出“在大多数情况下不需要”)。
  2. 提供了一个不错的RPC实现,而不仅仅是插入您自己的钩子。
  3. 更多受官方支持的语言(PB为Java,C ++,Python提供“官方”支持)

节俭的缺点:

  1. RPC的实现意味着我不能在顶部插入自己的(例如)加密/身份验证层。
  2. Windows支持似乎不是很好。
  3. PB肯定有更好的文档,甚至更好。

中性:

  • Windows(Thrift)上.lib / .dll的未知大小。
  • Windows上较大的.lib文件(PB,但确实提供了-lite,后者明显更小)。
  • 在速度方面,它们似乎是相似的。

我还没有准备好尝试跳槽并切换到Thrift,有人可以为我提供更多的优点/缺点,还是有理由选择一种方法?

谢谢!

trans by 2020-08-06T21:57:38Z

如何设计可在多种客户端语言中使用的C / C ++库?

我正计划编写一个库,该库应在广泛的平台上可供大量人使用。 我必须考虑什么才能正确设计它? 为了使这个问题更具体,最后有四个“子问题”。

语言选择

考虑到所有已知的要求和细节,我得出结论,使用C或C ++编写的库是可行的方法。 我认为该库的主要用法将是用C,C ++和Java SE编写的程序,但我也可以考虑从Java ME,PHP,.NET,Objective C,Python,Ruby,bash脚本, 等等...也许我无法针对所有目标,但如果可能的话,我会做到的。

要求

在这里描述我的图书馆的全部目的将是非常重要的,但是对于此问题,有些方面可能很重要:

  • 库本身开始时很小,但是肯定会变得非常复杂,因此不能并行维护多个版本。
  • 不过,大多数复杂性都将隐藏在库中
  • 该库将构造一个在内部大量使用的对象图。 库的某些客户端将只对特定对象的特定属性感兴趣,而其他客户端必须以某种方式遍历对象图
  • 客户可以更改对象,并且必须通知库
  • 库可能会更改对象,并且如果已经拥有该对象的句柄,则必须通知客户端
  • 该库必须是多线程的,因为它将维护与其他几台主机的网络连接
  • 尽管对库的某些请求可能是同步处理的,但其中许多请求将花费很长时间,并且必须在后台进行处理,并在成功(或失败)时通知客户端

当然,无论是满足我的特定要求,还是以对更广泛的受众都重要的一般方式回答问题,答案都是受欢迎的!

到目前为止,我的假设

因此,这是我在过去几个月中收集的一些假设和结论:

  • 在内部,我可以使用所需的任何东西,例如 带有运算符重载,多重继承,模板元编程的C ++,只要有一个可处理它的便携式编译器即可(例如gcc / g ++)
  • 但是我的接口必须是不涉及名称修饰的干净的C接口
  • 另外,我认为我的接口应该只包含函数,基本/原始数据类型(可能是指针)作为参数和返回值传递
  • 如果我使用指针,我想我应该只使用它们将它们传递回库,而不是直接在引用的内存上进行操作
  • 为了在C ++应用程序中使用,我可能还提供了一个面向对象的接口(这也易于进行名称修改,因此App必须使用相同的编译器,或者以源代码形式包含库)
  • C#中的用法也是如此吗?
  • 为了在Java SE / Java EE中使用,将应用Java本机接口(JNI)。 我对此有一些基本知识,但是我绝对应该仔细检查一下。
  • 并非所有客户端语言都能很好地处理多线程,因此应该有一个与客户端对话的线程
  • 为了在Java ME上使用,没有JNI之类的东西,但是我可能会使用嵌套VM
  • 要在Bash脚本中使用,必须具有带有命令行界面的可执行文件
  • 对于其他客户端语言,我不知道
  • 对于大多数客户端语言,最好使用那种语言编写的适配器接口。 我认为有一些工具可以自动为Java和其他一些工具生成此工具
  • 对于面向对象的语言,可能可以创建一个面向对象的适配器,该适配器掩盖了库接口基于函数的事实-但我不知道这样做是否值得

可能的子问题

  • 这是可以通过可管理的努力实现的吗,还是只是过于便携?
  • 有没有关于这种设计标准的好书/网站?
  • 我的假设有错吗?
  • 哪些开放源码库值得从其设计/接口/源中学习?
  • meta:这个问题相当长,您看到任何将它分成几个较小的问题的方法吗? (如果您回答此问题,请作为评论而不是作为答案)
trans by 2020-08-06T19:03:58Z

从本质上讲,lambda关闭自身是否有效?

此Lambda递归有效吗?

#include <functional>
#include <iostream>

int main() {
   std::function<int(int)> g = [&g](int k) {
       return (k ? k * g(k-1) : 1);
   };

   std::cout << g(10); // 3628800
}

它似乎可以编译并运行良好,但我担心在初始化它的同一条语句中关闭g。 严格有效度为1-10 ...?

trans by 2020-08-06T18:51:46Z

c ++-强类型语言有多远?

假设我正在编写一个API,并且我的一个函数使用一个表示通道的参数,并且只会在0到15之间。我可以这样写:

void Func(unsigned char channel)
{
    if(channel < 0 || channel > 15)
    { // throw some exception }
    // do something
}

还是我利用C ++作为强类型语言的优势,并使自己成为一种类型:

class CChannel
{
public:
    CChannel(unsigned char value) : m_Value(value)
    {
        if(channel < 0 || channel > 15)
        { // throw some exception }
    }
    operator unsigned char() { return m_Value; }
private:
    unsigned char m_Value;
}

我的功能现在变成这样:

void Func(const CChannel &channel)
{
    // No input checking required
    // do something
}

但这完全是过度杀伤力吗? 我喜欢自我说明文件,并保证它像它所说的那样,但是值得付出这种对象的构造和破坏,更不用说所有其他类型的输入了吗? 请让我知道您的评论和替代方法。

trans by 2020-08-06T15:16:34Z

C ++-错误:“ {”令牌之前的预期类名

我知道stackoverflow和其他网站也有几个类似的问题(循环包括)。 但是我仍然无法弄清楚,也没有解决的办法。 因此,我想发表我的具体观点。

我有一个Event类,其中有2个,实际上还有更多的子类,即Arrival和Landing。 编译器(g ++)抱怨:

g++ -c -Wall -g -DDEBUG Event.cpp -o Event.o
In file included from Event.h:15,
                 from Event.cpp:8:
Landing.h:13: error: expected class-name before ‘{’ token
make: *** [Event.o] Error 1

人们说这是一个通告。 3个头文件(Event.h Arrival.h Landing.h)如下:

Event.h:

#ifndef EVENT_H_
#define EVENT_H_

#include "common.h"
#include "Item.h"
#include "Flight.h"

#include "Landing.h"

class Arrival;

class Event : public Item {
public:
    Event(Flight* flight, int time);
    virtual ~Event();

    virtual void occur() = 0;
    virtual string extraInfo() = 0; // extra info for each concrete event

    // @implement
    int compareTo(Comparable* b);
    void print();

protected:
    /************** this is why I wanna include Landing.h *******************/
    Landing* createNewLanding(Arrival* arrival); // return a Landing obj based on arrival's info

private:
    Flight* flight;
    int time; // when this event occurs

};

#endif /* EVENT_H_ */

到达时间:

#ifndef ARRIVAL_H_
#define ARRIVAL_H_

#include "Event.h"

class Arrival: public Event {
public:
    Arrival(Flight* flight, int time);
    virtual ~Arrival();

    void occur();
    string extraInfo();
};

#endif /* ARRIVAL_H_ */

登陆

#ifndef LANDING_H_
#define LANDING_H_

#include "Event.h"

class Landing: public Event {/************** g++ complains here ****************/
public:
    static const int PERMISSION_TIME;

    Landing(Flight* flight, int time);
    virtual ~Landing();

    void occur();
    string extraInfo();
};

#endif /* LANDING_H_ */

更新:

由于在Event :: createNewLanding方法中调用了Landing的构造函数,因此包含了Landing.h:

Landing* Event::createNewLanding(Arrival* arrival) {
    return new Landing(flight, time + Landing::PERMISSION_TIME);
}
trans by 2020-08-06T14:26:21Z

如何找到int []的大小?

我有

int list[] = {1, 2, 3};

如何获得sizeof(array) / sizeof(array[0])的大小?

我知道对于char数组,我们可以使用sizeof(array) / sizeof(array[0])查找大小,或者在数组末尾检查'\0'


我尝试了sizeof(array) / sizeof(array[0]),就像一些答案说的那样,但它仅在主要方面有效吗? 例如:

int size(int arr1[]){
    return sizeof(arr1) / sizeof(arr1[0]);
}

int main() {
    int list[] = {1, 2, 3};

    int size1 = sizeof(list) / sizeof(list[0]); // ok
    int size2 = size(list_1); // no
    // size1 and size2 are not the same
}

为什么?

trans by 2020-08-06T13:46:50Z

转换std :: bind到功能点

我有一个第三方库,该库具有一种将函数指针作为第一个参数的方法:

int third_party_method(void (*func)(double*, double*, int, int, double*), ...);

我想传递一个指向类方法的指针,该方法声明如下:

class TestClass
{
    public:
        void myFunction (double*, double*, int, int, void*);

我试图通过此功能,如下所示:

TestClass* tc = new TestClass();
using namespace std::placeholders;
third_party_method(std::bind(&TestClass::myFunction, tc, _1, _2, _3, _4, _5), ...);

但是,这不能编译:

Conversion of parameter 1 from 'std::tr1::_Bind<_Result_type,_Ret,_BindN>' to 'void (__cdecl *)(double *,double *,int,int,void *)' is not possible
with
[
    _Result_type=void,
    _Ret=void,
    _BindN=std::tr1::_Bind6<std::tr1::_Callable_pmf<void (__thiscall TestClass::* const )(double *,double *,int,int,void *),TestClass,false>,TestClass *,std::tr1::_Ph<1>,std::tr1::_Ph<2>,std::tr1::_Ph<3>,std::tr1::_Ph<4>,std::tr1::_Ph<5>>
]

有什么办法可以将成员传递给函数?

trans by 2020-08-06T12:24:37Z

C ++中的指针“ this + 1”指的是什么?

我在浏览Sequitur G2P的代码时发现了一个非常奇怪的代码行:

public:
    ...
    const Node *childrenEnd() const { return (this+1)->finalized.firstChild_; }

我知道this是指向当前对象的指针,并且由于它是指针,因此该操作完全合法,但是this+1实际指的是什么?

trans by 2020-08-06T10:22:44Z

c#-创建简单的c ++。net包装器。 一步步

我有一个c ++项目。 我承认我是c ++中的完整零。 但是我仍然需要编写一个c ++。net包装器,这样我才能使用一个使用它的非托管c ++库。 所以我有:1)非托管项目的头文件。2)非托管项目的库(.dll和.lib)3)一个空的C ++。NET项目,我打算用作我的C#应用程序的包装器

我该如何开始? 我什至不知道如何设置对非托管库的引用。

S.O.S.

trans by 2020-08-06T09:20:50Z

无法打开包含文件:'stdio.h'-Visual Studio社区2017-C ++ E

我正在尝试在Visual Studio Community 2017上构建解决方案,但始终收到错误“无法打开包含文件:'stdio.h'”。 我已经阅读了几个类似的问题,但仍然无法解决此问题。 看起来在stdafx.h文件中调用了stdio.h文件。 以下是更多详细信息。 有什么建议? (我尚无法嵌入图像,因此请单击屏幕快照的链接。)

系统细节:Windows 10
Visual Studio社区2017 v.15.2(26430.6)
-使用C ++安装了Desktop Development(屏幕截图:安装列表)


步骤1:我用C ++编写了著名的Hello World程序。

#include "stdafx.h"
#include <iostream>
using namespace std;

int main()
{
    cout << "Hello World!" << endl;
    return 0;
}

步骤2:我点击Build> Build Solution。

问题:'stdio.h':没有这样的文件或目录。 完全错误:

1>------ Build started: Project: HelloWorld, Configuration: Debug Win32 ------
1>stdafx.cpp
1>c:\users\dahiana mini\desktop\learncpp\helloworld\helloworld\stdafx.h(10): 
    fatal error C1083: Cannot open include file: 'stdio.h': No such file or directory
1>Done building project "HelloWorld.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

故障排除详细信息/我尝试过的事情:

  1. 配置属性> VC ++目录
    #include "stdafx.h"
  2. 屏幕截图:解决方案资源管理器(项目中的文件)
  3. stdafx.cpp文件中的代码:

    #include "stdafx.h"
  4. stdafx.h文件中的代码:

    #include "stdafx.h"

    注意:<stdio.h><tchar.h>#include "stdafx.h"下方都有红色花线,并显示“无法打开源文件”。
    尝试:我尝试删除最后两行,但随后出现更多错误。

  5. 尝试:由于许多建议不需要stdafx.h,因此我尝试仅删除第一行#include "stdafx.h"。但是,要使此行有效,我必须做更多的事情。 请参阅下面的答案。

trans by 2020-08-06T08:10:41Z

c ++-在Linux中明确导出共享库函数

是否有Linux的2999129093037360360表示法,用于从共享库中显式导出函数? 由于我使用的工具链的某些原因,不是类成员的函数不会出现在生成的共享库文件中。

trans by 2020-08-06T07:42:09Z

header-在C ++中更改当前工作目录

如何以与平台无关的方式在C ++中更改当前的工作目录?

我发现direct.h头文件与Windows兼容,而unistd.h与UNIX / POSIX兼容。

trans by 2020-08-06T07:30:44Z

为什么没有int128_t?

许多编译器提供128位整数类型,但是我使用的所有编译器都没有提供typedefsintmax_t。为什么?

据我所记得,标准

  • 为此预留intmax_t
  • 鼓励提供这种类型的实现提供typedef
  • 要求此类实现提供至少128位的intmax_t

(而且,我不相信我使用了实际上符合最后一点的实现)

trans by 2020-08-06T05:49:27Z

const指针对指针在C和C ++中是什么意思?

我知道从右到左阅读声明的经验法则,并且我很确定自己知道发生了什么,直到一位同事告诉我:

const MyStructure** ppMyStruct;

表示“ ppMyStruct是指向(可变的)MyStructure的const指针的指针”(在C ++中)。

我以为它的意思是“ ppMyStruct是指向const MyStructure的指针的指针”。我在C ++规范中寻找答案,但是显然我不太擅长...

在C ++中是什么意思,在C中是否意味着相同的意思?

trans by 2020-08-06T05:32:40Z

您可以在c或c ++中分配很大的单个内存块(> 4GB)吗?

这些天来,我想知道使用大量的RAM,是否可以分配大于4GB的单个内存块? 还是我需要分配一堆较小的块并处理它们之间的切换?

为什么???我正在处理一些openstreetmap xml数据,这些文件很大。 我目前正在流式传输它们,因为无法将它们全部加载到一个块中,但是我只是对malloc或new的上限感到好奇。

trans by 2020-08-06T05:02:58Z

标识符“字符串”未定义?

我收到错误:标识符“字符串”未定义。

但是,我包含string.h,并且在我的主文件中,一切正常。

码:

#pragma once
#include <iostream>
#include <time.h>
#include <string.h>

class difficulty
{
private:
    int lives;
    string level;
public:
    difficulty(void);
    ~difficulty(void);

    void setLives(int newLives);
    int getLives();

    void setLevel(string newLevel);
    string getLevel();
};

有人可以向我解释为什么会这样吗?

trans by 2020-08-06T04:48:19Z

Windows / C ++:是否可以找到引发“异常偏移”的异常所在的代码行

我们的一位用户在我们的产品启动时遇到异常。她已从Windows向我们发送了以下错误消息:

  Problem Event Name:                        APPCRASH
  Application Name:                          program.exe
  Application Version:                       1.0.0.1
  Application Timestamp:                     4ba62004
  Fault Module Name:                         agcutils.dll
  Fault Module Version:                      1.0.0.1
  Fault Module Timestamp:                    48dbd973
  Exception Code:                            c0000005
  Exception Offset:                          000038d7
  OS Version:                                6.0.6002.2.2.0.768.2
  Locale ID:                                 1033
  Additional Information 1:                  381d
  Additional Information 2:                  fdf78cd6110fd6ff90e9fff3d6ab377d
  Additional Information 3:                  b2df
  Additional Information 4:                  a3da65b92a4f9b2faa205d199b0aa9ef

是否可以在源代码中找到具有此信息的发生异常的确切位置?

Windows上C ++程序员查找用户计算机上已发生错误的位置的常用技术是什么?

我们的项目使用Release配置进行编译,生成了PDB文件。

我希望我的问题不会太幼稚。

trans by 2020-08-06T03:53:16Z

c-在Q中添加额外的编译器选项

这个问题已经在这里有了答案:

  • 我在Qt Creator中的哪里将参数传递给编译器? 6个答案

我可以在Qt的哪里指定其他编译器选项? 例如-std = c ++ 0x?

trans by 2020-08-06T03:45:08Z

C ++ getter应该返回什么

C ++ getter方法的最佳实践是什么,该方法应该返回非平凡类型,但返回类型为class或struct的成员。

  1. 按值返回,例如:myClass
  2. 通过const参考返回:myClass
  3. 按地址返回:myClass

哪里

class MyType { /* ... */ };

class MyClass
{
  private:
     MyType mMyType;
}

我特别担心此方法的以下用法。 如果myClass想要保存它以备后用,您能否详细说明这可能如何影响复制对象以及悬挂引用和野生指针的危险。

MyType* savedPointer;

SomeType function(MyType* pointer) { savedPointer = pointer; };

一个。 适用于1.和2。

{
  MyType t = myClass.getMyType();
  function(&t);
}

// is savedPointer still valid here?

b。 适用于1.和2。

{
  const MyType& t = myClass.getMyType();
  function(&t);
}

// is savedPointer still valid here?

C。 适用于1.和2。

{
  MyType& t = myClass.getMyType();
  function(&t);
}

// is savedPointer still valid here?

d。 有效期为3。

{
  MyType* t = myClass.getMyType();
  function(t);
}

// is savedPointer still valid here?

其中myClassMyClass类型的对象。

trans by 2020-08-06T03:01:33Z

我应该使用std :: for_each吗?

我一直在尝试更多地了解我使用的语言(不同的样式,框架,模式等)。 我注意到我从未使用过[](int n),所以我认为也许应该开始。 在这种情况下,我们的目标是扩大思想范围,而不是在某种程度上改善代码(可读性,表达性,紧凑性等)。

因此,考虑到这种情况,最好将29987398581197219721984用于简单的任务,例如打印矢量:

for_each(v.begin(), v.end(), [](int n) { cout << n << endl; }

[](int n)是lambda函数)。 代替:

for(int i=0; i<v.size(); i++) { cout << v[i] << endl; }

我希望这个问题似乎没有意义。 我猜这几乎要问一个更大的问题...中级程序员是否应该使用语言功能,即使他此时实际上并不需要,但只是为了使他可以在一段时间内更好地理解该功能,而这实际上可能会从中受益匪浅 它。 尽管可能已经问过了这个更大的问题(例如此处)。

trans by 2020-08-06T01:15:43Z

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 下一页 共190页