ورود

View Full Version : مشکل با عملوند * و کلاسهای مشتق شده



pswin.pooya
پنج شنبه 12 شهریور 1388, 22:31 عصر
سلام

من یک کلاس ماتریس دارم که عملوند ضرب رو براش تعرف کردم:
http://iautabriz.persiangig.com/source_code/cpp/examples/matrix.zip

و از این کلاس دو کلاس دیگه به اسم ModelViewMatrix و ProjectionMatrix مشتق کردم. حالا باید چی کار کنم که ضرب زیر ارور نده؟؟


ProjectionMatrix prj;
ModelviewMatrix model;
mat4f s = prj * model;


mat4f هم یک ماتریس چهار در چهار از نوع float هستش.

Nima_NF
جمعه 13 شهریور 1388, 00:25 صبح
شما کد مشتق شده خود را قرار ندادید تا اشکال کار شما را در قسمت مشتق دقیق بتوانم بگویم.

با نگاه سریعی که انجام دادم، چند اشکالات در کدهای شما دیدم:

1- در قسمت قالب نوشته اید unsigned row و unsigned column که من تعریفی از row به عنوان ثابت ندیدم، چون منظور شما یک عدد صحیح از ورودی بود پس باید همه جا int هم بنویسید در غیر این صورت خود کامپایلر یک نوع را در نظر می گیرد:
unsigned int row



template <unsigned int row,unsigned int column,typename TYPE>


2- وقتی توابع و عملگرها را به صورت inline تعریف می کنید، دیگر نیاز نیست داخل کلاس قبل از توابع template بنویسید. پس آن ها را حذف کنید، مگر اینکه خارج از کلاس می خواهید تعریف آن ها را بنویسید.در هر صورت قالب باید یکی باشد که همان قالب کلاس هست.
(برای تابع ضرب این کار را انجام دهید و template را حذف کنید که اشتباها قالب دیگری با تنها یک نوع تعریف کرده اید که صحیح نیست، مگر اینکه منظور خاص دیگری داشتید که بنده متوجه نشدم...)


3- کد مشتق را به شکل زیر می توانید بنویسید که خطا دریافت نکنید:



template <unsigned int row,unsigned int column,typename TYPE>
class ProjectionMatrix : public matrix<row,column, TYPE>
{
public:
ProjectionMatrix (): matrix<row,column, TYPE>() { }
ProjectionMatrix (TYPE* data1): matrix<row,column, TYPE>(data1) { }
~ProjectionMatrix () { }
};


برای مثال هم به این شکل ضرب کنید (فراموش نکنید که مشتق هم باز یک قالب هست):



ProjectionMatrix<4,4,float> test1(temp);
ProjectionMatrix<4,4,float> test2(temp);
mat4 s = test1 * test2;



ضمنا من دو روزی نیستم، اگر سوالی یا ایرادی بود که احیانا بنده متوجه منظورتان نشدم، دو روز دیگه در خدمت هستم.

pswin.pooya
جمعه 13 شهریور 1388, 15:09 عصر
سلام
تا اونجا که من میدونم تگه بعد از unsigned نوع تعریف نشه به صورت پیش فرض int در نظر گرفته میشه. این موضوع رو تو یکی از پروژه های OpenSource دیدم. دقیقا یادم نیست ولی فکر کنم OGRE بودش

و

تعریف ماتریس پروجکشن به صورت زیر هستش:


class ProjectionMatrix :public Matrix<4,4,float>

بابت مورد دوم، ممنونم ولی برای مورد سوم دلیل نداره که همچین کاری کنم چون ماتریس پروجکشن 100 درصد یه ماتریس 4 در 4 از نوع float هستش. اگه اشتباه نکنم باید این عملوندها رو از اول تعریف کنم.