这是问题的情节:假设我有一些对象的抽象类,我们称之为 Object .它的定义将包括 2D 位置和尺寸。让它也有一些virtual void Render(Backend& backend) const = 0用于渲染的方法。
现在我专门化我的继承树并添加 Rectangle和 Ellipse类(class)。我猜他们不会有自己的属性(property),但他们会有自己的virtual void Render方法。假设我实现了这些方法,所以 Render对于 Rectangle实际上画了一些矩形,椭圆也一样。
现在,我添加了一些名为 Plane 的对象,定义为 class Plane : public Rectangle并且有一个私有(private)成员 std::vector<Object*> plane_objects;
紧接着我添加了一个方法来将一些对象添加到我的平面上。
问题来了。 如果我将此方法设计为 void AddObject(Object& object)我会遇到无法调用虚函数的麻烦,因为我必须做类似 plane_objects.push_back(new Object(object)); 的事情。这应该是 push_back(new Rectangle(object))对于矩形和 new Circle(...)对于圈子。
如果我将此方法实现为 void AddObject(Object* object) , 它看起来不错,但是在其他地方这意味着像 plane.AddObject(new Rectangle(params)); 这样的调用这通常是一团糟,因为不清楚我的程序的哪一部分应该释放分配的内存。
[“当摧毁飞机时?为什么?我们确定对 AddObject 的调用只是作为 AddObject(new something 完成的)。]
我猜想可以使用智能指针解决使用第二种方法引起的问题,但我确信必须有更好的方法。
有什么想法吗?
最佳答案
您的实际问题似乎是管理对象的生命周期。想到的四种可能性是:
您的容器(即 Plane )拥有所有包含对象的所有权,因此 delete一旦它自己被摧毁,就把它们收起来。
您的容器 ( Plane) 不承担所有权,任何向您的容器添加对象的人都将负责销毁它们。
对象的生命周期是自动管理的。
您可以通过为容器提供实际对象的克隆来规避问题。容器管理对象的拷贝,调用者管理原始对象。
您目前拥有的似乎是方法 #4。通过这样做:
plane_objects.push_back(new Object(object));
您将对象的拷贝插入到容器中。因此问题有点消失了。问问自己这是否真的是您想要的,或者以上选择之一是否更合适。
选项 #1 和 #2 很容易实现,因为它们定义了您的实现必须遵循的契约。选项 #3 要求例如智能指针,或涉及引用计数的其他一些解决方案。
如果您想继续遵循选项 #4 的方法,您可以例如扩展您的 Object类 clone方法,以便它返回正确类型的对象。这将摆脱不正确的 new Object(...) .
class Object
{
public:
virtual Object* clone() const = 0;
...
};
...
Object* Rectangle::clone() const
{
return new Rectangle(*this); // e.g. use copy c'tor to return a clone
}
附注:请注意 STL 容器似乎是如何处理这个问题的:假设您声明了一个 vector<Foo>。 .该 vector 将包含插入其中的对象的拷贝(我的回答中的选项 #4)。但是,如果您将集合声明为 vector<Foo*> ,它将包含对原始对象的引用,但不会管理它们的生命周期(我的回答中的选项 #2)。
关于C++设计相关问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2708423/
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
由于fast-stemmer的问题,我很难安装我想要的任何rubygem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www