小编Tur*_*bar的帖子

连接 C 风格的强制转换操作毫无意义吗?

在工作中,我在我的代码库中找到了这段代码,其中字符被转换了两次:

constexpr unsigned int foo(char ch0, char ch1, char ch2, char ch3)
{
    return   ((unsigned int)(unsigned char)(ch0) 
           | ((unsigned int)(unsigned char)(ch1) << 8)
           | ((unsigned int)(unsigned char)(ch2) << 16) 
           | ((unsigned int)(unsigned char)(ch3) << 24))
           ;
}
Run Code Online (Sandbox Code Playgroud)

一个演员阵容还unsigned int不够吗?
在这种情况下,最好将其设为static_cast<unsigned_int>?

c++ casting

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

unique_ptr&lt;T&gt;::get() 返回的指针在原始 unique_ptr 被销毁后不是 nullptr

我有一个基类的 unique_ptrs 全局向量,我将 unique_ptrs 附加到派生类:

std::vector<std::unique_ptr<Base>> global_vec;

template<typename T>
Base* create_object()
{
  std::unique_ptr<T> uptr = std::make_unique<T>(/* ... */);
  Base* last_ptr = uptr.get();
  global_vec.emplace_back(std::move(uptr));
  return last_ptr; /*this is a bit irrelevant, but is for the caller*/
}
Run Code Online (Sandbox Code Playgroud)

现在,Base 本身有一个指向 Base 的原始指针的成员向量:

struct Base
{
  ...
  std::vector<Base*> providers;
  ...
}
Run Code Online (Sandbox Code Playgroud)

组成 Base::providers 的指针都是通过从 global_vec 调用 unique_ptr::get() 获得的:

void Base::subscribe_to(Base* src)
{
  providers.push_back(src);
}
Run Code Online (Sandbox Code Playgroud)

Base 有一个与这些订阅者一起工作的成员函数,并在工作之前检查 nullptr:

void Base::do_work()
{
  ...
  for(Base* ptr : providers)
  {
    if(ptr != nullptr)
    {
      ...
    }
  } …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance unique-ptr

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

标签 统计

c++ ×2

casting ×1

inheritance ×1

unique-ptr ×1