C++ C++;std::按向量排序<;对象*>;-只读位置的分配

C++ C++;std::按向量排序<;对象*>;-只读位置的分配,c++,stdvector,C++,Stdvector,更新的解决方案: 对于我的特殊问题,sort调用位于标记为const的呈现函数中。通过删除常量(不是我的首选项)或将排序放在另一个函数中(在本例中,是我的更新的底部),问题就解决了。正如一些回答者所说,这是一个常量问题,只是不是我在找的地方 原始问题 我有一个指向对象的指针的std::vector列表,声明如下: std::vector<Object*> myObjects; 尽管我抱怨分配了只读位置或类似位置,但还是收到了十几个左右的错误: /Developer/Platfor

更新的解决方案:

对于我的特殊问题,sort调用位于标记为const的呈现函数中。通过删除常量(不是我的首选项)或将排序放在另一个函数中(在本例中,是我的更新的底部),问题就解决了。正如一些回答者所说,这是一个常量问题,只是不是我在找的地方


原始问题

我有一个指向对象的指针的std::vector列表,声明如下:

std::vector<Object*> myObjects;
尽管我抱怨分配了只读位置或类似位置,但还是收到了十几个左右的错误:

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/include/c++/4.2.1/bits/stl_algo.h:2385: error: assignment of read-only location
我肯定这是我在做的傻事。。。有人能帮我解释一下吗?我对我的C++生疏了,只是重新回到它里面去!如有任何建议,将不胜感激

更新

尽管尝试了iammilind的建议,将const全部删除或确保const为100%(换句话说,我尝试将const添加到SortByDistance谓词的末尾,并将其从情况中完全删除,但我仍然会遇到相同的错误

我想其中一位评论者可能是在暗示我正在做一些愚蠢而危险的事情:将指向对象的原始指针存储在STL容器中。但我从来没有做过任何不同的事情……将对象存储在容器中而不是在堆上动态分配的原因是什么?我假设如果我没有处理wi通过原始指针,我排序问题的许多复杂性消失了

我目前正在创建如下对象:

std::vector<Object*> myObjects;
Object* tempObject = new Object;
myObjects.push_back(tempObject);
std::向量对象;
对象*临时对象=新对象;
myObjects.push_back(临时对象);
当然,我会在程序完成后释放内存,但听起来这只是一个坏主意

关于一个更相关的问题(关于我所问的问题),下面是stl_algo.h中的代码:

  template<typename _RandomAccessIterator, typename _Compare>
void
__insertion_sort(_RandomAccessIterator __first,
         _RandomAccessIterator __last, _Compare __comp)
{
  if (__first == __last) return;

  for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
{
  typename iterator_traits<_RandomAccessIterator>::value_type
    __val = *__i;
  if (__comp(__val, *__first))
    {
      std::copy_backward(__first, __i, __i + 1);
      *__first = __val;  // this line is the one complaining about read-only assignment
    }
  else
    std::__unguarded_linear_insert(__i, __val, __comp);
}
}
模板
无效的
__插入排序(\u RandomAccessIterator\u优先,
_RandomAccessIterator(最后一个,比较比较)
{
if(_first==_last)返回;
for(_RandomAccessIterator_uuui=uu first+1;uu i!=uu last;++uu i)
{
类型名迭代器特征::值类型
__val=*uu i;
如果(uu comp(u val,*u first))
{
std::向后复制(uuu-first,uuu-i,uuu-i+1);
*__first=\uu val;//这一行是抱怨只读赋值的行
}
其他的
标准::uuu无保护的u线性u插入(uu i,u val,u comp);
}
}
尽管尝试了各种常量/无常量解决方案,我仍然会得到相同的错误。如果我注释掉运行排序的行: 排序(myObjects.begin()、myObjects.end()、SortByDistance);
当然,错误也会消失。

< P>只是从您的代码中,我猜您的<代码>对象::GETDistAudie(<代码> >方法不是<代码> const <代码>。在C++中,<代码> const <代码>对象的<代码>类< /C> >只能调用<代码> const 成员。 如果是这种情况,那么有两种方法可以消除此错误

(1) 将
GetDist
设为
const

class Object {
  int GetDist () const;  // <-- add const
};

GetDist()
Object
的成员还是从
Object
派生的类的成员?stl_algo.h行2385有什么?啊!stl容器中的原始指针!作为Billy ONeal评论的澄清-如果你不使用原始指针来拥有它们的对象,那么这很好(通常是正确的做法)如果他们被用于所有权,事情会变得更可怕……米迦勒:我相信我是在使用它们来拥有所有权……我实际上经常这样做。这是一个有点偏离的话题,但我肯定很想知道为什么这是个问题,更好的解决办法是什么。就像我说的,我承认,C++在5年的Web开发中脱颖而出。ent启动,所以回到一个更自然的OOP设置是(很好,但是)缓慢的:)我想我以前已经尝试过这两种解决方案。。。让我再试一次,我会回来的。这确实很有道理。。。也许我在尝试这个理论的时候忘记了一些琐碎的事情!是的,一定是别的什么我没想到的东西还在制造麻烦。如果我将GetDist设置为const:
int GetDist()const我仍然得到错误。如果我将SortByDistance设置为不具有任何常量(并因此将GetDist设置为不具有常量),我将得到完全相同的错误。我能想到的唯一一件事是,在STL容器中这样使用指针是一种糟糕的做法。还有什么我应该检查的可能会引起问题吗?@David,最好更新你问题中的错误,并在评论部分通知我。iammilind:在运行了一些const变体之后,我用情境更新了原始问题。我也试着退后一步,让你知道我为什么一开始就这么做。。。也许有更好的办法,但这根本行不通?这是用于iPhone/iPad开发的Xcode 4.2beta btw。Compliler:llvmgcc4.2.AHA!我知道了!我的特定代码集的问题是,包含排序调用的呈现函数被标记为const。还有一个很好的例子,说明了周围的代码比您想象的更相关!再次感谢大家帮我看了这个。我将用这个观点更新这个问题。
  template<typename _RandomAccessIterator, typename _Compare>
void
__insertion_sort(_RandomAccessIterator __first,
         _RandomAccessIterator __last, _Compare __comp)
{
  if (__first == __last) return;

  for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
{
  typename iterator_traits<_RandomAccessIterator>::value_type
    __val = *__i;
  if (__comp(__val, *__first))
    {
      std::copy_backward(__first, __i, __i + 1);
      *__first = __val;  // this line is the one complaining about read-only assignment
    }
  else
    std::__unguarded_linear_insert(__i, __val, __comp);
}
}
class Object {
  int GetDist () const;  // <-- add const
};
bool SortByDistance (Object*, Object*); // <-- remove const