小编dor*_*ron的帖子

条件变量与信号量

什么时候应该使用信号量,什么时候应该使用条件变量(CondVar)?

multithreading synchronization operating-system semaphore mutual-exclusion

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

在C++中复制多态对象

我有Base派生的基类Derived1,Derived2Derived3.

我为其中一个派生类构建了一个实例,我将其存储为Base* a.我现在需要制作一个我将存储的对象的深层副本Base* b.

据我所知,复制类的正常方法是使用复制构造函数并重载operator=.但是,因为我不知道是否a是类型Derived1,Derived2或者Derived3,我想不出使用复制构造函数的方法operator=.我能想到的唯一方法是干净利落地完成这项工作:

class Base
{
public:
  virtual Base* Clone() = 0;

};
Run Code Online (Sandbox Code Playgroud)

Clone派生类中的实现如下:

class Derivedn : public Base
{
public:
  Base* Clone() 
  {
    Derived1* ret = new Derived1;
    copy all the data members
  }
};
Run Code Online (Sandbox Code Playgroud)

Java倾向于使用Clone相当多的C++方式更多吗?

c++ clone

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

虚拟方法或功能指针

在C++中实现多态行为时,可以使用纯虚方法,也可以使用函数指针(或函子).例如,异步回调可以通过以下方式实现:

方法1

class Callback
{
public:
    Callback();
    ~Callback();
    void go();
protected:
    virtual void doGo() = 0;  
};

//Constructor and Destructor

void Callback::go()
{
   doGo();
}
Run Code Online (Sandbox Code Playgroud)

因此,要在此处使用回调,您需要覆盖doGo()方法以调用您想要的任何函数

方法2

typedef void (CallbackFunction*)(void*)

class Callback
{
public:
    Callback(CallbackFunction* func, void* param);
    ~Callback();
    void go();
private:
   CallbackFunction* iFunc;
   void* iParam;
};

Callback::Callback(CallbackFunction* func, void* param) :
    iFunc(func),
    iParam(param)
{}

//Destructor

void go()
{
    (*iFunc)(iParam);
}
Run Code Online (Sandbox Code Playgroud)

要在此处使用回调方法,您需要创建一个由Callback对象调用的函数指针.

方法3

[这是我(Andreas)在问题中添加的; 它不是由原始海报写的]

template <typename T>
class Callback
{
public:
    Callback() {}
    ~Callback() {}
    void go() {
        T …
Run Code Online (Sandbox Code Playgroud)

c++ virtual-functions function-pointers

32
推荐指数
3
解决办法
9292
查看次数

受保护与私人析构函数

C++中的protected和private析构函数之间有什么区别吗?如果基类析构函数是私有的,我想在删除派生类对象时仍然会调用它.

c++

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

关于C++ 0x,我需要了解什么?

可能重复:
我在哪里可以了解有关C++ 0x的更多信息?

我对C++ 03非常熟悉,但我仍然需要与C++ 0x达成协议,所以我想阅读一些关于C++ 0x的相当易懂的信息.

我查看了维基百科,但我正在寻找更具可读性的东西.那么是否有一本书或一系列博客文章可以提供对该matarial的精彩介绍?

c++ c++11

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

Elipses是否为case语句标准C/C++

我正在浏览linux内核中的一些代码,我遇到了类似的语句 case '0' ... '9':

为了试试这个,我在下面创建了测试程序.

#include <iostream>

int main()
{
    const int k = 15;

    switch (k)
    {
    case 0 ... 10:
        std::cout << "k is less than 10" << std::endl;
        break;
    case 11 ... 100:
        std::cout << "k is between 11 and 100" << std::endl;
        break;
    default:    
        std::cout << "k greater than 100" << std::endl;
        break;
    }
}   
Run Code Online (Sandbox Code Playgroud)

上面的程序确实编译了,虽然我之前从未遇到过case语句构造中的elipses.这个标准的C和C++还是这个语言的GNU特定扩展?

c c++

13
推荐指数
2
解决办法
3332
查看次数

有条件编译的注意事项

何时进行条件编译是一个好主意,什么时候是一个非常糟糕的主意呢?

通过条件编译,我的意思是使用#ifdefs仅在某些条件下编译某些代码位.所述#definedš本身可以是在任一个共同的头文件或经由引入的-D编译器指令.

c c++ coding-style

12
推荐指数
1
解决办法
9875
查看次数

浮点平等和容差

比较两个浮点数a_float == b_float由于寻找麻烦,因为a_float / 3.0 * 3.0可能不等于a_float由于舍入错误.

人们通常做的事情是这样的fabs(a_float - b_float) < tol.

如何计算tol

理想情况下,公差应该大于一个或两个最低有效数字的值.因此,如果使用单精度浮点数tol = 10E-6应该是正确的.然而,这对于a_float可能非常小或可能非常大的一般情况不适用.

如何tol正确计算所有一般情况?我特别感兴趣的是C或C++案例.

c c++ floating-point floating-accuracy

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

多线程堆管理

在C/C++中,我可以在一个线程中分配内存并在另一个线程中删除它.然而,每当从堆请求内存时,堆分配器需要遍历堆以找到适当大小的空闲区域.两个线程如何在不破坏堆的情况下有效地访问同一个堆?(这是通过锁定堆来完成的吗?)

memory heap operating-system

11
推荐指数
1
解决办法
7431
查看次数

Linux崩溃分析

在Linux上分析崩溃的最佳方法是什么?

我们希望构建软件并向测试人员提供发布版本.测试人员可能无法记住如何重现崩溃或崩溃可能完全断断续续.他们的机器上也没有开发环境.该软件使用C/C++编写,并编译为本机代码以进行分发.

c c++ linux crash

9
推荐指数
2
解决办法
3886
查看次数