草庐IT

c++ - 常量类成员、赋值运算符和 QList

coder 2024-02-07 原文

如果我说的对请采纳并告诉我是否有更好的解决方案:

我了解具有常量成员的对象,如 int const width; 不能由编译器隐式创建的合成赋值运算符处理。但是 QList(我想 std::list 也是)需要一个有效的赋值运算符。因此,当我想使用具有常量成员和 QList 的对象时,我有三种可能性:

  1. 不要使用常量成员。 (不是解决方案)
  2. 实现我自己的赋值运算符。
  3. 使用其他一些不需要赋值的容器 运营商

这是正确的吗?还有其他优雅的解决方案吗?

另外我想知道我是否可以:

  • (4) 强制编译器创建一个处理常量成员的赋值运算符! (我不明白为什么这是一个这么大的问题。为什么运算符不够智能,无法在内部使用初始化列表?还是我遗漏了什么?)
  • (5) 告诉QList我永远不会在列表中使用赋值操作。

编辑:我从来没有自己分配这个类的对象。它们仅由复制构造函数或重载构造函数创建。所以赋值运算符只有容器需要,我自己不需要。

EDIT2:这是我创建的赋值运算符。我不确定它是否正确。 Cell 有一个两个参数的构造函数。这些参数使用初始化列表设置两个常量成员。但是该对象还包含其他变量(非 const)成员。

Cell& Cell::operator=(Cell const& other)
{
 if (this != &other) {
  Cell* newCell = new Cell(other.column(), other.row());
  return *newCell;
 }
 return *this;
}

EDIT3:我发现这个线程有几乎相同的问题:C++: STL troubles with const class members所有答案结合在一起回答了我的问题。

最佳答案

您可能是 C++ 的新手,并期望它的行为类似于 Python、Java 或 C#。

将不可变的 Java 对象放入集合中是很常见的。这是可行的,因为在 Java 中,您并没有真正将 Java 对象 放入集合中,而只是将引用 Java 对象的 Java 引用 放入集合中。更准确的说,一个集合内部由Java引用变量组成,赋值给这些Java引用变量根本不会影响引用的Java对象。他们甚至没有注意到。

我故意说“Java对象”、“Java引用”和“Java变量”,因为“对象”、“引用”和“变量”这三个术语在C++中有着完全不同的含义。如果你想要可变的 T 变量,你想要可变的 T 对象,因为变量和对象在 C++ 中基本上是一样的:

A variable is introduced by the declaration of an object. The variable's name denotes the object.

在 C++ 中,变量不包含对象——它们对象。给变量赋值意味着改变对象(通过调用成员函数operator=)。没有其他办法了。如果你有一个不可变对象(immutable对象),那么赋值 a = b 不能 可能在不显式破坏类型系统的情况下工作,如果你这样做,那么你实际上是在欺骗你的客户关于对象是不可变的。作出 promise 然后故意违背它是毫无意义的,不是吗?

当然,您可以简单地模拟 Java 方式:使用一组指向不可变对象(immutable对象)的指针。这是否是一个有效的解决方案取决于您的对象真正代表什么。但仅仅因为这在 Java 中运行良好并不意味着它在 C++ 中运行良好。 在 C++ 中没有不可变值对象模式这样的东西。这在 Java 中是个好主意,在 C++ 中是个糟糕的主意。

顺便说一句,您的赋值运算符完全不符合惯用语并且会泄漏内存。如果你认真学习 C++,你应该阅读 one of these books .

关于c++ - 常量类成员、赋值运算符和 QList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4288190/

有关c++ - 常量类成员、赋值运算符和 QList的更多相关文章

  1. ruby-on-rails - 未初始化的常量 Psych::Syck (NameError) - 2

    在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到ruby​​gems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决

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

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

  3. ruby-on-rails - active_admin 目录中的常量警告重新声明 - 2

    我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA

  4. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  5. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  6. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  7. ruby-on-rails - ActionController::RoutingError: 未初始化常量 Api::V1::ApiController - 2

    我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc

  8. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  9. ruby - 在 Ruby 中重新分配常量时抛出异常? - 2

    我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案

  10. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

随机推荐