这个问题试图收集每年出版的数十本不良C++书籍中的少数珍珠.
与许多其他编程语言不同,这些编程语言经常从互联网上的教程中随处获取,很少有人能够快速学习C++,而无需学习编写精良的C++书籍.这样做太复杂了.事实上,它是如此庞大和复杂,有很多非常糟糕的C++书籍.我们并不是在谈论糟糕的风格,而是体育明显的事实错误和促进糟糕的编程风格.
请编辑接受的答案,以提供高质量的书籍和近似的技能水平 - 最好 在 C++聊天室讨论您的添加后.(如果他们不同意建议,常客可能会毫不留情地撤销你的工作.)添加一篇关于你亲自阅读/受益的每本书的简短描述/描述.随意讨论质量,标题等.符合标准的书籍将被添加到列表中.由C和C++用户协会(ACCU)撰写评论的图书都有指向评论的链接.
*注意:常见问题和其他资源可以在C++标签信息和c ++ - faq中找到.
我找到了有趣的东西.错误消息说明了一切.在获取非静态成员函数的地址时不允许使用括号的原因是什么?我在gcc 4.3.4上编译了它.
#include <iostream>
class myfoo{
public:
int foo(int number){
return (number*10);
}
};
int main (int argc, char * const argv[]) {
int (myfoo::*fPtr)(int) = NULL;
fPtr = &(myfoo::foo); // main.cpp:14
return 0;
}
Run Code Online (Sandbox Code Playgroud)
错误:main.cpp:14:错误:ISO C++禁止获取非限定或带括号的非静态成员函数的地址,以形成指向成员函数的指针.说'&myfoo :: foo'
我正在使用std::bind但是当我们将它与成员类函数一起使用时,我仍然不知道它是如何工作的.
如果我们有以下功能:
double my_divide (double x, double y) {return x/y;}
Run Code Online (Sandbox Code Playgroud)
我完全理解下一行代码:
auto fn_half = std::bind (my_divide,_1,2); // returns x/2
std::cout << fn_half(10) << '\n'; // 5
Run Code Online (Sandbox Code Playgroud)
但是现在,通过以下代码我们有一个绑定到成员函数我有一些问题.
struct Foo {
void print_sum(int n1, int n2)
{
std::cout << n1+n2 << '\n';
}
int data = 10;
};
Foo foo;
auto f = std::bind(&Foo::print_sum, &foo, 95, _1);
f(5);
Run Code Online (Sandbox Code Playgroud)
为什么第一个参数是参考?我想得到一个理论上的解释.
第二个参数是对象的引用,对我来说是最复杂的部分需要理解.我认为这是因为std::bind需要一个背景,我是对的吗?总是这样吗?std::bind当第一个参数是成员函数时,是否有某种实现要求引用?
有人可以解释PVOID在以下函数中使用的是什么以及如何使用它:
BOOL DoSomething(PVOID pMemPhy)
Run Code Online (Sandbox Code Playgroud) 我在一个内存受限的嵌入式环境中工作,其中malloc/free new/delete是不可取的,我正在尝试使用std :: function模式来注册回调.我无法访问目标代码中的任何STL方法,因此我不得不自己复制一些STL功能.函数指针对我来说不是一个选项,因为调用者必须有捕获.
例如,我希望声明一个类邮箱,其中可以注册onChange事件
class Mailbox {
std::function<void(int,int)> onChange;
};
Run Code Online (Sandbox Code Playgroud)
这样,调用者可以注册一个lambda onChange处理程序,它可以捕获这个或其他对处理事件很重要的变量.
由于这是API的一部分,我想为Mailbox的用户提供最大的灵活性,以提供函数指针,lambda或functor.
我已经设法找到一个看起来特别低开销的一个很好的实现,std::function并且正是我需要的,除了它涉及动态内存.
如果你看下面的代码,动态内存只用在一个地方,它看起来完全作用于被模板化的对象,向我建议它的大小应该在编译时知道.
任何人都可以帮助我理解如何重构这个实现,以便它是完全静态的,并删除使用new/malloc?我无法理解为什么CallableT的大小在编译时无法计算.
下面的代码(不适合胆小的人).注意,它使用make_unique/ unique_ptr但可以很容易地用new和*替换它们并且我已成功测试了该用例.
#include <iostream>
#include <memory>
#include <cassert>
using namespace std;
template <typename T>
class naive_function;
template <typename ReturnValue, typename... Args>
class naive_function<ReturnValue(Args...)> {
public:
template <typename T>
naive_function& operator=(T t) {
callable_ = std::make_unique<CallableT<T>>(t);
return *this;
}
ReturnValue operator()(Args... args) const {
assert(callable_);
return callable_->Invoke(args...);
}
private:
class ICallable {
public:
virtual ~ICallable() = …Run Code Online (Sandbox Code Playgroud) C\C++是否支持回调函数的机制?以及如何创建它?我写了几个代码,用C++创建回调函数但是失败了..
#include<iostream>
using namespace std;
void callee()
{
printf("callee\n");
printf("calleeeeeeeeee\n");
}
void callback(void* func)
{
printf("callback\n");
}
int main()
{
void (*call)(void*);
void (*call2)(void);
call2 = &callee;
call = &callback;
call((void*)call2);
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud) 正如标题所要求的那样,我发现自己无法在C++中实现简单(ha)的回调函数.
现在,如果您正在考虑"我确定我之前已经看到了问题/答案",那么您绝对正确,即:c ++中的回调函数
我重新发布的原因是我无法获得任何工作.我已经尝试将我完全理解的第一个答案[1]直接应用到我的代码中; 但我得到30个错误.
这30个错误的第一个问题,我不明白.它与typedef声明有关:
typedef std::tr1::function<int (const GameCharacter&)> HealthCalcFunc;
Run Code Online (Sandbox Code Playgroud)
似乎缺少'tr1':
..\..gLib\..sor.h(47) : error C2039: 'function' : is not a member of 'std::tr1'
Run Code Online (Sandbox Code Playgroud)
以下错误让人想起失踪的';' 失踪或类似:
..\..gLib\..sor.h(47) : error C2143: syntax error : missing ';' before '<'
..\..gLib\..sor.h(47) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
..\..gLib\..sor.h(47) : error C2238: unexpected token(s) preceding ';'
..\..gLib\..sor.h(51) : error C2061: syntax error : identifier 'DataProcessorFunc'
..\..gLib\..sor.h(104) : error C2146: syntax error : missing ';' …Run Code Online (Sandbox Code Playgroud) 像标题一样.作为一名新的程序员,了解我的项目机制以及使用它们的不同之处非常重要.任何人都可以给我一个答案,谢谢!