एचपीपी:

class Camera {
public:
    Camera(float FOV, float nearPlane, float farPlane);

    std::unique_ptr<glm::mat4x4> getProjectionMatrix();

private:
    std::unique_ptr<glm::mat4x4> projectionMatrix;
};

सीपीपी:

Camera::Camera(float FOV, float nearPlane, float farPlane) {

    float aspectRatio = DisplayManager::displayWidth / DisplayManager::displayHeight;

    projectionMatrix = std::make_unique<glm::mat4x4>();
    *projectionMatrix = glm::perspective(FOV, aspectRatio, nearPlane, farPlane);
}

std::unique_ptr<glm::mat4x4> Camera::getProjectionMatrix() {
    //std::unique_ptr<glm::mat4x4> projectionMatrix = std::make_unique<glm::mat4x4>();
    //*projectionMatrix = glm::perspective(90.0f, 1.333f, 0.1f, 1000.0f);
    return std::move(projectionMatrix);
}

दो टिप्पणी पंक्तियों को देखें। कार्यक्रम संकलित करेगा कि उन पर टिप्पणी की गई है या नहीं, लेकिन यदि वे हैं, तो डेटा दूषित हो जाएगा।

मैं एक गेटर कैसे लिख सकता हूं जो एक अद्वितीय_ptr लौटाता है जो कक्षा का एक निजी सदस्य है? मैं कंस्ट्रक्टर में unique_ptr को ठीक से कैसे सेट करूं?

0
Karlovsky120 6 नवम्बर 2016, 01:36
1
आप एक unique_ptr क्यों वापस करना चाहते हैं जिसका उपयोग किस लिए किया जाएगा?
 – 
Galik
6 नवम्बर 2016, 01:41
आप उस प्रोजेक्शन मैट्रिक्स के साथ क्या कर रहे हैं? ऐसा लगता है कि आप एक पर्यवेक्षक सूचक को वापस करने के साथ ठीक होंगे, इसे केवल असाइन करने की स्थिति में प्रस्तुत करने के बजाय
 – 
krzaq
6 नवम्बर 2016, 01:41
ऑब्जर्वर पॉइंटर भी ठीक है। मुझे मैट्रिक्स को रेंडरर को पास करने की आवश्यकता है ताकि वह इसे एक शेडर में लोड कर सके।
 – 
Karlovsky120
6 नवम्बर 2016, 01:42
1
आप मैट्रिक्स को किसी अन्य ऑब्जेक्ट से एक्सेस करना चाहते हैं लेकिन क्या आप मैट्रिक्स को Camera से हटाना चाहते हैं? मुझे संदेह है कि आपको एक कच्चा सूचक लौटाना चाहिए यदि आप जानते हैं कि Camera के दायरे से बाहर हो जाने के बाद इसका उपयोग नहीं किया जाएगा। या यहां तक ​​​​कि मैट्रिक्स का संदर्भ भी।
 – 
Galik
6 नवम्बर 2016, 01:44
1
आप इन चीजों के लिए आवंटित स्मृति का उपयोग क्यों कर रहे हैं?
 – 
Nicol Bolas
6 नवम्बर 2016, 01:47

1 उत्तर

सबसे बढ़िया उत्तर

यहां एक बेहतर विचार है: अनावश्यक रूप से स्मृति आवंटित करना बंद करें। Camera को सीधे glm::mat4x4 स्टोर करें, unique_ptr के रूप में नहीं। सी ++ जावा नहीं है; आपको new के साथ सब कुछ आवंटित करने की आवश्यकता नहीं है। आपका सभी कोड बहुत आसान हो जाता है:

Camera::Camera(float FOV, float nearPlane, float farPlane)
    : projectionMatrix(glm::perspective(FOV, (DisplayManager::displayWidth / DisplayManager::displayHeight), nearPlane, farPlane))
{
}

glm::mat4x4 &Camera::getProjectionMatrix() { return projectionMatrix; }

हालांकि, अगर आपको Camera में unique_ptr का बिल्कुल उपयोग करना है, तो आपको एक संदर्भ वापस करना चाहिए, न कि एक स्मार्ट पॉइंटर:

glm::mat4x4 &Camera::getProjectionMatrix() { return *projectionMatrix; }
4
Nicol Bolas 6 नवम्बर 2016, 01:50