【问题标题】:C++ parameter is a pointer to a constant object but the updated object is not returned?C++ 参数是一个指向常量对象的指针但不返回更新的对象?
【发布时间】:2011-10-25 14:00:54
【问题描述】:

我有本机 C++ 类 SrcClass,其中包含以下内容:

std::vector<shotEntry> objectsQueue;

bool getRelatedEntry(const entryToProcess *entriesDeets, int &i) const {
    if (i >= (int)objectsQueue.size()) {
        i = 0;
        return false;}
    if (!objectsQueue.size()) return false;
    entriesDeets = &(objectsQueue[i++]);
    return true;
}

在我的客户中,我有:

const entryToProcess *entriesDeets = NULL;
int i = 0;
while (srcObj->getRelatedEntry(entriesDeets, i)) {

当我单步执行getRelatedEntry 形式参数时,entriesDeets 在返回之前按预期更新。返回时客户端的实际参数没有更新。

这是我离开两个月后回到的一些大项目。我很确定我所做的最后一次重构是引入这些 damnable vectors。当我弄乱标题时,编译需要很长时间。我是否对 C# 的初始化一次/只读/常量感到困惑?我可以让客户端返回只读本机对象吗?

【问题讨论】:

  • 您可能对从函数返回多个值的其他方式感兴趣:stackoverflow.com/q/321068/10077
  • 在向量内使用指向对象的指针时要小心。如果将项目添加到向量中,则可能会发生重新分配,一切都会移动,并且您的指针将无效。
  • 我的代码与 UI 使用的任何线程完全同步。我实际上只是抓住指针,将其更新到屏幕然后丢弃它。

标签: c++ pointers parameters vector constants


【解决方案1】:

这是因为您正在设置函数参数的值。你想要:

bool getRelatedEntry(const entryToProcess **entriesDeets, int &i) const {
    ...
    *entriesDeets = &(objectsQueue[i++]);
    ...

和

srcObj->getRelatedEntry(&entriesDeets, i)

【讨论】:

  • 或者如 Benamin Lindley 所说,引用指针:bool getRelatedEntry(const entryToProcess *&amp;entriesDeets, int &amp;i) const {,无需其他更改。
  • 但是** 比*&amp; 更具可读性,您可能需要了解关联性。
【解决方案2】:

entriesDeets 是 getRelatedEntry 中的一个局部变量。你只修改了本地,不影响传入的值,需要传入指针的引用或者指针的指针。

【讨论】:

    【解决方案3】:

    指针已更新,但它是函数内部的内部副本。如果您希望该更改在函数外部可见,则应传递一个引用:

    //                                         v
    bool getRelatedEntry(const entryToProcess *&entriesDeets, int &i) const {
    

    或者在 C 风格中使用双指针并在每次使用时在内部取消引用它:

    //                                         v
    bool getRelatedEntry(const entryToProcess **entriesDeets, int &i) const {
       // ...
       *entriesDeets = &(objectsQueue[i++]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 2021-06-19
      • 2011-10-01
      • 2021-08-01
      • 2017-12-26
      • 2020-05-15
      • 1970-01-01
      相关资源
      最近更新 更多