C++ 指针参数在 'ret' 指令之前设置为 NULL

标签 c++ templates pointers arguments

<分区>

我遇到了一个特殊问题。我以为我了解相当多的 C++,但我一定忽略了一些细微差别?

我有一些模板类,基本上所有发生的事情都是基于某种条件,一个对象正在从一个 std::list 移动到另一个。

这里关注的方法是doAndGet( T *t )。我的意图是让 t 以 NULL 的形式出现(或者其他什么,我真的不在乎,但它应该是 NULLnullptr,如果我最终将 T 元素 *tmyList 移动到 myOtherList,我想要 T *t 指向被移动的项目。

现在也许有一些关于 std::list 我不知道的东西,但是当单步执行我的代码时,t 被正确分配并且 - 最初我方法返回后想到,后来发现——就在ret指令之前,参数T *t被设置回NULL/p>

任何大师都可以阐明这个问题吗?这真是让我头疼...

template<typename T, typename C>
class Base : IsDerivedFrom<T, C>
{
public:
    typedef std::list<T*> SpecialList;
    virtual bool doAndGet( T* t ) = 0;

protected:

    SpecialList myList;
};

template<typename T>
class Derived : public Base<T, Other>, public Other
{
public:
    Derived( void );
    virtual ~Derived( void );

    bool doAndGet( T* t );

protected:

    typename Base<T, Other>::SpecialList myOtherList;

};

template<typename T>
bool Derived<T>::doAndGet( T *t )
{
    // Nothing to process
    if (myOtherList.empty()) {return false;}

    t = (*myOtherList.begin());
    myOtherList.pop_front();

    if (true/* some condition needs to be moved */)
    {
        t->status = 1;
        this->myList.push_back(t);
        return true;
    } else
    {
        // Something bad happened...
        delete t;
        t = nullptr;
        return false;
    }
}

// Use... (pretend I defined MyOtherClass somewhere, not important)
Derived<MyOtherClass> derivedInstance;

MyOtherClass *t = nullptr;
if ( derivedInstance.doAndGet(t) )
{
    // ... Here I should expect `t` to be not `NULL` and not `nullptr`
    // This however, is not ever the case in my testing...
}

最佳答案

如果您想将一个变量传递给一个函数,并将该函数内的任何更改反射(reflect)回调用者,您需要使用引用。

C++ 与 C 一样,是按值传递的,其中函数仅获取变量的拷贝。 C++ 具有允许通过引用传递的引用。

换句话说,你的函数签名应该是:

bool doAndGet( T* &t );

声明 t 是对 T* 的引用,允许更改反射(reflect)回调用方的原始指针。

一个更简单的例子如下:

#include <iostream>
static void change (int a, int &b) { a = b = 0; }
int main() {
    int a = 42, b = 42;
    change (a, b);
    std::cout << a << ' ' << b << '\n';
    return 0;
}

这会输出 42 0,因为传入的 a 是按值传递的,更改不会反射(reflect)回调用方。 b 作为引用传入,因此更改 会反射(reflect)回来。

关于C++ 指针参数在 'ret' 指令之前设置为 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24133001/

相关文章:

c++ - 如何从命令行编译 bada gcc 工具链?

c++ - 这种模板部分特化的目的是什么?

c++ - 指向成员的指针

c++ - 对于构造函数,我如何在可变参数模板与 std::initializer_list 之间进行选择?

c++ - 在 C++ 中复制整数数组

c++ - 无法调用模板类,C++

java - 在通用 Spring CRUD DAO 中获取正确的 Hibernate 模板

c - 做了一些指针数学但不起作用

c++ - 在堆中创建一个函数指针数组

c++ - 在文件可移植性问题中存储 32 位 float