小编use*_*367的帖子

当我通过C++中的空指针调用成员函数时,为什么程序不会崩溃?

#include "iostream"
using namespace std;
class A
{
public:
    void mprint()
    {
        cout<<"\n TESTING NULL POINTER";
    }
};

int main()
{
    A *a = NULL;
    a->mprint();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我输出为"TESTING NULL POINTER".任何人都可以解释为什么这个程序打印输出而不是崩溃.我在Dev C++和aCC编译器上检查了它们都给出了相同的结果.

c++ null member-functions

16
推荐指数
3
解决办法
1199
查看次数

在 C++ 中使用线程交替打印奇数和偶数打印

使用线程打印奇偶数 我遇到了这个问题,想讨论 C++ 中的解决方案。我可以想到使用 2 个二进制信号量奇数和偶数信号量。偶数信号量初始化为 1,奇数信号量初始化为 0。

**T1 thread function** 
funOdd()
{  
  wait(even)  
  print odd;  
  signal(odd)  
}


**T2 thread function**
funEven()  
{  
  wait(odd)  
  print even  
  signal(even)  
}  
Run Code Online (Sandbox Code Playgroud)

除此之外,如果我的函数只生成数字并且有第三个线程 T3 将打印这些数字,那么理想的设计应该是什么?我使用了一个数组,其中奇数将放置在奇数位置,偶数将放置在偶数位置。T3 将从这个数组中读取,这将避免对该数组的任何线程安全,如果 T3 没有找到任何索引,那么它将等待该索引被填充。另一种解决方案是使用一个队列,该队列将有一个互斥锁,T1 和 T2 在插入时可以使用该互斥锁。

请对此解决方案发表评论,以及如何使其更有效率。

编辑以使问题更清楚:总体问题是我有两个生产者(T1,T2)和一个消费者(T3),并且我的生产者是相互依赖的。

c++ multithreading semaphore thread-safety

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

虚拟功能打破私人访问

我最近在IBM网站看过这篇文章.下面是示例代码

#include "iostream"

class B {
public:
  virtual void f()
  {
    std::cout<<"\n In class B";
  }
};

class D : public B {
private:
    int i;

  void f()
  {
  std::cout<<"\n In class D i = "<<i;
  }
  public:
    D(int i_num):i(i_num)
    {}
};

int main() {
  D dobj(10);
  B* bptr = &dobj;
  D* dptr = &dobj;

  // valid, virtual B::f() is public,
  // D::f() is called
  bptr->f();

  // error, D::f() is private
  //dptr->f();
}
Run Code Online (Sandbox Code Playgroud)

我们现在能够调用DI的私有函数想知道这不会破解C++封装吗?

PS:请转到虚拟功能中的虚拟功能访问部分.我不知道为什么我粘贴时没有得到确切的链接.

c++ virtual

2
推荐指数
1
解决办法
624
查看次数

多个typedef用于相同类型

下面的代码是类初始化列表,它在Ubuntu标准包中提供.在这个迭代器和const_iterator中是相同类型的typedef.我只是想知道为什么我们希望为不同类型的迭代器使用相同的typedef?理想情况下,对于Iterator,它应该有typedef _E*迭代器.

// In the class initializer list:
namespace std 
{ 
  /// initializer_list 
  template<class _E> 
    class initializer_list 
    { 
    public: 
      typedef _E                value_type; 
      typedef const _E&         reference; 
      typedef const _E&         const_reference; 
      typedef size_t            size_type; 
      typedef const _E*         iterator; 
      typedef const _E*         const_iterator;
Run Code Online (Sandbox Code Playgroud)

PS:我无法想到合适的头衔,所以我给了这个头衔

c++ stl typedef

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

默认参数函数签名更改

我有一个函数,其当前签名是f(a,b = 0).我想添加另一个参数c.我希望我的函数能够以这种方式调用f(a,b),这是当前行为和f(a,c).一种方法是重载函数并复制功能代码.我不想从f(a,c)调用f(a,b).我在C++工作.

是否有任何标准设计模式或解决方案可以避免此代码重复?

c++ overloading

-1
推荐指数
1
解决办法
828
查看次数