返回指向成员数据的指针

时间:2014-09-24 13:00:21

标签: c++

伪代码,我不知道这是否编译,但你明白了。

class DataHolder
{
    void GetData(float* ptr)
    {
        ptr = dataNeededByOtherClass;
    }

    float* dataNeededByOtherClass; // Initialized and modified elsewhere
};

class DataUser
{
    void DoStuff()
    {
         float* ptrToData;
         dataHolder->GetData(ptrToData);

         // ptrToData points to garbage Why?

         ptrToData = dataHolder->dataNeededByOtherClass;
         // ptrToData now points to the correct data
    }
};

我在这看什么?

2 个答案:

答案 0 :(得分:5)

功能

void GetData(float* ptr)

按值接收指针参数。修改函数中的ptr不会更改ptrToData的值。相反,尝试通过指针传递指针:

void GetData(float** ptrptr)
{
    *ptrptr = dataNeededByOtherClass;
}

float* ptrToData;
dataHolder->GetData(&ptr);

P.S。请注意,以这种方式公开类变量不被视为最佳做法。

答案 1 :(得分:3)

您的代码中存在多个语法错误。下面的代码并没有像你在上面的文字中提到的那样添加构造函数和析构函数。你的数据需要来自某个地方:)我采取了下面创建一个SetData方法的libery。请注意,我还在析构函数中释放缓冲区的内存,并且在设置指针时,如果指针不为null。如果你不想要这样就把它切掉:)

工作代码

class DataHolder
{
private:
    float* dataNeededByOtherClass; // Initialized and modified elsewhere
public:
    float* GetData()
    {
        return dataNeededByOtherClass;
    }

    void SetData(float* ptr)
    {
        // Remove if you intend to keep this memory and release it elsewhere
        if (dataNeededByOtherClass != NULL)
            delete[] dataNeededByOtherClass;

        dataNeededByOtherClass = ptr;
    }   

    // You are missing constructors and destructors
    DataHolder() : dataNeededByOtherClass(NULL){};
    DataHolder(float *ptr) : dataNeededByOtherClass(ptr){};
    ~DataHolder()
    {
        // if you want to release data after class is destructed.. if not remove these lines
        if (dataNeededByOtherClass != NULL)
            delete[] dataNeededByOtherClass;
    };
}

class DataUser
{
    void DoStuff()
    {
        DataHolder dataHolder; // either feed data in c'tor or use dataHolder->SetData() for filling data, now it's just empty.. 
        float* ptrToData = dataHolder.GetData();
    }
};

希望它有所帮助。