2014-09-24 58 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(); 
    } 
}; 

希望它能幫助。