我应该在C ++的类中存储引用吗?

戴维德·卡罗尔(Daviid Carol)

在学习C ++时,有人告诉我,如果要让多个类引用同一个对象,则应同时提供一个指向该对象的指针。在Modern C ++中,我可能会将其解释为对象是unique_ptr,并且该类包含非所有者原始指针。

最近,我的指导者在工作中建议您仅在计划将存储指向另一个对象或在某个时候将其设置为null时才应使用指针。相反,您应该将引用存储在类中。

引用成员变量是我实际上从未见过的事情,因此我一直在寻找有关所关注问题的建议...这是有道理的...您是说该引用假定永远不会为空...我想这可能是因为您不能/ check /为null。它必须是您的班级的不变式...

如何将引用用于多态性呢?


更新:我选择的答案很好地涵盖了我的问题,但我想为以后的读者澄清一下。我真正要寻找的是关于使用引用而不是指针作为类成员的后果的想法。我意识到问题的表达方式听起来更像是我在寻求有关此想法的意见。

马辛尼

我应该在C ++的类中存储引用吗?

是的,为什么不。这个问题是基于“主要基于意见”的IMO,因此我的回答基于我自己的经验。

当我不需要提供指针时,我使用成员引用,这样可以限制我的类将被错误使用的可能性。这意味着绑定新值,分配nullptr,无法获取指向引用的指针,不能使用引用算法的其他可能性-引用中缺少这些功能。您还应该记住,引用不是对象类型,这意味着,如果您将引用作为结构成员放置,则它不再是POD-即您不能在其上使用memcpy。

您还应该记住,对于具有非静态引用成员的类,编译器将不会生成隐式构造函数。

对我来说,这意味着当类是某种包装程序或持有人时,作为变量成员的引用最有用。下面的示例还显示了使用指针成员类型的替代实现。这种替代实现没有给您带来额外的好处,仅使引入未定义的行为成为可能。

struct auto_set_false {
   bool& var;
   auto_set_false(bool& v) : var(v) {}
   ~auto_set_false() { var = false; }
};

struct auto_set_false_ptr {
   bool* var;
   auto_set_false_ptr(bool* v) : var(v) {}
   ~auto_set_false_ptr() { *var = false; }
};

int main()
{
    // Here auto_set_false looks quite safe, asf instance will always be
    // able to safely set nval to false. Its harder (but not imposible) to 
    // produce code that would cause Undefined Bahaviour. 
    bool nval = false;
    auto_set_false asf(nval);

    bool* nval2 = new bool(true);
    auto_set_false_ptr asf2(nval2);    
    // lots of code etc. and somewhere in this code a statement like:
    delete nval2;
    // UB
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我应该在C ++中删除静态对象吗

来自分类Dev

我应该在C#中通过属性设置器分配类字段吗?

来自分类Dev

我应该在Java中嵌套这些类吗?

来自分类Dev

我应该在C ++ / CLI类中使用C#对象的引用还是实例?

来自分类Dev

我应该在c ++的派生类中继承嵌套类吗?

来自分类Dev

我应该在C中的basename / dirname之后释放strdup指针吗?

来自分类Dev

我可以/应该在C#中替换此GOTO语句吗

来自分类Dev

我应该在C#中显式地将`GetObjectData`方法虚拟化吗?

来自分类Dev

我应该在C#dllimport本机方法调用中为参数释放内存吗?

来自分类Dev

我应该在sqlite中存储什么颜色?

来自分类Dev

我应该在模型中抛出HttpStatus异常吗?

来自分类Dev

我应该在交易中包含SELECT吗?

来自分类Dev

我应该在表示层中抛出异常吗?

来自分类Dev

我应该在onDestroyView中删除OnClickListener吗?

来自分类Dev

我应该在virtualenv中安装python 3吗?

来自分类Dev

我应该在Rust中返回等待吗?

来自分类Dev

我应该在virtualenv中安装python 3吗?

来自分类Dev

我应该在系统中杀死僵尸进程吗?

来自分类Dev

我应该在onDestroyView中删除OnClickListener吗?

来自分类Dev

我应该在备份中包含/ dev吗?

来自分类Dev

我应该在简单的策略游戏中为各个派系使用类 - C++

来自分类Dev

我应该在C ++中分开cpp和h文件吗?

来自分类Dev

我们应该在C ++中使用exit吗?

来自分类Dev

我应该在C ++中使用'const'关键字吗

来自分类Dev

我应该在学习Swift之前学习一下object-c吗?

来自分类Dev

我应该在C ++库中使用日志记录吗

来自分类Dev

我应该在运行时创建C#表单吗

来自分类Dev

我是否应该在C99中跨翻译单元故意内联函数

来自分类Dev

我应该在哪里捕获构造函数中引发的C ++异常?

Related 相关文章

  1. 1

    我应该在C ++中删除静态对象吗

  2. 2

    我应该在C#中通过属性设置器分配类字段吗?

  3. 3

    我应该在Java中嵌套这些类吗?

  4. 4

    我应该在C ++ / CLI类中使用C#对象的引用还是实例?

  5. 5

    我应该在c ++的派生类中继承嵌套类吗?

  6. 6

    我应该在C中的basename / dirname之后释放strdup指针吗?

  7. 7

    我可以/应该在C#中替换此GOTO语句吗

  8. 8

    我应该在C#中显式地将`GetObjectData`方法虚拟化吗?

  9. 9

    我应该在C#dllimport本机方法调用中为参数释放内存吗?

  10. 10

    我应该在sqlite中存储什么颜色?

  11. 11

    我应该在模型中抛出HttpStatus异常吗?

  12. 12

    我应该在交易中包含SELECT吗?

  13. 13

    我应该在表示层中抛出异常吗?

  14. 14

    我应该在onDestroyView中删除OnClickListener吗?

  15. 15

    我应该在virtualenv中安装python 3吗?

  16. 16

    我应该在Rust中返回等待吗?

  17. 17

    我应该在virtualenv中安装python 3吗?

  18. 18

    我应该在系统中杀死僵尸进程吗?

  19. 19

    我应该在onDestroyView中删除OnClickListener吗?

  20. 20

    我应该在备份中包含/ dev吗?

  21. 21

    我应该在简单的策略游戏中为各个派系使用类 - C++

  22. 22

    我应该在C ++中分开cpp和h文件吗?

  23. 23

    我们应该在C ++中使用exit吗?

  24. 24

    我应该在C ++中使用'const'关键字吗

  25. 25

    我应该在学习Swift之前学习一下object-c吗?

  26. 26

    我应该在C ++库中使用日志记录吗

  27. 27

    我应该在运行时创建C#表单吗

  28. 28

    我是否应该在C99中跨翻译单元故意内联函数

  29. 29

    我应该在哪里捕获构造函数中引发的C ++异常?

热门标签

归档