2014-09-24 70 views
-3

伪代码,我不知道这是否编译,但你明白了。返回指向成员数据的指针

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

A)“我不知道这是否编译”,为什么你没有尝试编译它? B)指针是按值传递的,这意味着GetData()什么也不做(它修改本地参数)。为什么不直接从GetData()返回'dataNeededByOtherClass'呢? – Borgleader 2014-09-24 13:02:34

+0

数据是一些大小的数组。我还需要分开返回大小。 – TheDespite 2014-09-24 13:05:57

+2

我不明白这是如何阻止你做float * GetData(){return dataNeededByOtherClass; }'。哪一个会更清楚。 – Borgleader 2014-09-24 13:09:39

回答

5

功能

void GetData(float* ptr) 

由值接收指针参数。在函数内修改ptr不会更改ptrToData的值。相反,试图通过指针传递一个指针:

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

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

附:请注意,以这种方式暴露类变量不被视为最佳做法。

+0

虽然参考参数(可以说)比指针更可取;并且按价值返回一个值(无可辩驳)比两者都好。 – 2014-09-24 13:23:00

+0

@MikeSeymour是的。在现实世界中,我的偏好是:(a)不要做或者实现'const float * GetData()const'; (b)实现'float * GetData()const'; (c)使用参考。但为了这个练习,我猜'** ptrptr'更直接。 – AlexD 2014-09-24 13:28:52

3

嗨你的代码中有几个语法错误。下面的代码不会像上面提到的那样添加构造函数和析构函数。你的数据需要来自某处:)我在下面创建了一个SetData方法。请注意,我还在析构函数中以及设置指针时释放缓冲区的内存,如果指针不为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(); 
    } 
}; 

希望它能帮助。