草庐IT

c++ - 具有 std::unique_ptr 的容器的访问器函数

coder 2024-02-05 原文

我将要设计一个 API,其中存在两个类:数据/计算类和此类的容器。然而,容器不仅仅是一个哑容器,它还携带有关整个集合的信息,这超出了可以用迭代器实现的常见内容。

所以,容器基本上包装了一个 std::vector , 添加一些预先计算的属性,实用函数等。容器类的API还应该包含的是

  1. 添加 data/calc 类实例的方法,
  2. 访问方法。

我不只是想打开 std::vector对公众来说,因为向容器中添加新的 data/calc 类会导致重新计算集合类的许多属性。但是,我想提供与 STL 容器访问器方法相同的访问器方法 at()operator [] .

最初,我添加了一个 std::vector<std::unique_ptr<DataClass>> 类型的私有(private)属性.一个addDataObject(DataObject *d)存在将对象包装在 unique_ptr 中的方法并更新统计数据。

然而,访问器方法带来了问题:它们的返回类型是什么?

  • 只需返回 std::unique_ptr<DataClass> &似乎不是一个干净的 API 设计:API 的用户不需要知道我使用智能指针。 (另请参阅 Herb Sutter 关于 C++11 的演讲)
  • 返回 DataClass *&不可能,尤其是对于 operator [] ,因为我只能访问 std::unique_ptr 的原始指针使用智能指针的 get()方法,没有给我引用。
  • 返回 DataClass &似乎没有意义,尤其是当我存储指针时(堆与堆栈分配)。
  • 返回 DataClass *会违反最小意外原则,因为如果按照 STL 容器访问器方法命名方法,人们会期望它返回一个引用,尤其是对于 operator []。 .

作为说明,这将是一个简化的示例:

class DataClass
{
    Container *m_parent;
    /* ... other member attributes/parameters ... */
public:

     /* A method that calculates something based on the attributes: */
     double someComplicatedCalculation(const double &input);
};


class Container
{
     std::vector<std::unique_ptr<DataClass>> m_collection;

     /* more attributes: maintenance info, precomputed values, etc. */

  public:

      void addDataObject(DataClass *d);

      /* What would the right return type be? */

      DataClass *&at(const int &index);
      const DataClass *&at(const int &index) const;
      DataClass *&operator [](const int &index);
      const DataClass *&operator [](const int &index) const;
};

最佳答案

Returning DataClass & doesn't seem to make sense, especially when I'm storing pointers (heap vs. stack allocation).

我不同意。这就是所有标准容器返回的内容。除非你正在使用 unique_ptr 的事实应该对用户可见(我假设它不应该是),否则最不奇怪的方法就是按照标准库做:返回对象的左值引用。

此外,返回引用会使所有权清晰。如果您要返回一个指针,则必须在某处指明用户不得删除它。

关于c++ - 具有 std::unique_ptr 的容器的访问器函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29880704/

有关c++ - 具有 std::unique_ptr 的容器的访问器函数的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  4. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  5. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  6. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  7. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  8. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  9. ruby-on-rails - Rails 3.1 中具有相同形式的多个模型? - 2

    我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#

  10. ruby - 在 Ruby 中按名称传递函数 - 2

    如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只

随机推荐