PDA

View Full Version : بکار گیری یک متغیر در کلاس های دیگر



arashz4
چهارشنبه 02 دی 1394, 11:40 صبح
من میخام به یک متغیر تو یه کلاس که پابلیک تعریف شده در یک کلاس دیگه بهش مقدار بدم و اون مقدار رو در یه کلاس دیگه بگیرم
چطور میشه این کار رو کرد وقتی به متغیر یه مقدار میدم در یک کلاس دیگه تو همون کلاس میشه ازش استفاده کرد اگه بخای توی جایی دیگه ای ازش خروجی بگیری مقدارش خالی هست
نمیدوم منظورم رو فهمیدین یا نه یه متغیر تو یه کلاس تعریف شده و از هر کلاسی میشه بهش مقدار بدی و هر کلاسی هم بتونی خروجی یکسان بگیری
برای نمونه:

QApplication::setApplicationName("app name");
qDebug()<<QApplication::applicationName;
من یه چیزی مثل این میخام که از هر جا بشه بهش مقدار دارد و خروجی گرفت

phoenix2000
پنج شنبه 03 دی 1394, 07:55 صبح
سلام
اصولا اینکه یک متغیر رو در یک کلاس پابلیک کنید کار درستی نیست.چراکه اصلا با یکی از مزایای شی گرایی که کپسوله کردن متغیرها در کلاس هاست مغایرت داره.برای حل این مورد شما باید متدهای پابلیکsetter و getter رو تعریف کنید .در این صورت هروقت که این متدها را از هر کلاسی فراخوانی کردید باعث خوانده شدن (getter) و یا نوشتن(setter) درون آن متغیر یا بعبارتی دیگر فیلد می شوند.خب از مزایای این کار هم این است که می توانید در این متدها قوانین خودتان را وضع کنید مثلا بگویید برای مقداردهی فقط بایستی بین یک بازه خاص باشد وگرنه مقداردهی نکند و به کاربر اخطار دهد یا خیلی کارهای دیگر.
اون نمونه ای هم که شما مثال زدید دقیقا داره از setter (در خط 1) و getter (در خط 2) استفاده می کنه.اگه از qt creator استفاده می کنید در قسمتی که متغیر رو تعریف کردید بر روی آن راست کلیک کرده و refactor را بزنید تا به صورت اتوماتیک و راحت این متد ها برای شما ایجاد شوند و حالشو ببرید:لبخند: و اگر هم از idm دیگری مثل ویژوال استادیو استفاده می کنید که بنده اطلاعی ندارم چگونه اتوماتیک این متدها را ایجاد کنید هرچند به احتمال خیلی زیاد آن ها هم راهی برای ایجاد اتوماتیک دارند ولی به هرحال اگر هم نداشتند شما بصورت دستی ایجادشون کنید.

arashz4
سه شنبه 08 دی 1394, 12:45 عصر
سلام
اصولا اینکه یک متغیر رو در یک کلاس پابلیک کنید کار درستی نیست.چراکه اصلا با یکی از مزایای شی گرایی که کپسوله کردن متغیرها در کلاس هاست مغایرت داره.برای حل این مورد شما باید متدهای پابلیکsetter و getter رو تعریف کنید .در این صورت هروقت که این متدها را از هر کلاسی فراخوانی کردید باعث خوانده شدن (getter) و یا نوشتن(setter) درون آن متغیر یا بعبارتی دیگر فیلد می شوند.خب از مزایای این کار هم این است که می توانید در این متدها قوانین خودتان را وضع کنید مثلا بگویید برای مقداردهی فقط بایستی بین یک بازه خاص باشد وگرنه مقداردهی نکند و به کاربر اخطار دهد یا خیلی کارهای دیگر.
اون نمونه ای هم که شما مثال زدید دقیقا داره از setter (در خط 1) و getter (در خط 2) استفاده می کنه.اگه از qt creator استفاده می کنید در قسمتی که متغیر رو تعریف کردید بر روی آن راست کلیک کرده و refactor را بزنید تا به صورت اتوماتیک و راحت این متد ها برای شما ایجاد شوند و حالشو ببرید:لبخند: و اگر هم از idm دیگری مثل ویژوال استادیو استفاده می کنید که بنده اطلاعی ندارم چگونه اتوماتیک این متدها را ایجاد کنید هرچند به احتمال خیلی زیاد آن ها هم راهی برای ایجاد اتوماتیک دارند ولی به هرحال اگر هم نداشتند شما بصورت دستی ایجادشون کنید.
این مشکل من رو حل نمیکنه.
اگر ما 3 تا کلاس داشته باشیم که متغیر در کلاس 1 تعریف بشه (فرقی نمیکه چجوری از getter و setter استفاده شده باشه یا نه)
اگر من در کلاس 2 به متغیر یه مقدار بدم همون مقدار در کلاس 3 در دسترس نیست
چون توی کلاس 2 یک شی از کلاس 1 ساخته شده

class1 myclass;
myclass.setText("abc");
و برای گرفتن مقدار در کلاس 3 باید یک شی دیگه بسازی که مقدار خالی رو بر میگردونه چون توی شی که در کلاس 3 ساخته شده مقداری بهش داده نشده
اگر هم نخواهم شی بسازم باید اینجوری به متغیر مقدار بدم

class1::setText("sfs"); بهم در زمان کامپایل ارور میده : cannot call member function

arashz4
چهارشنبه 09 دی 1394, 16:51 عصر
کسی نیست راهنمایی کنه؟:ناراحت:

phoenix2000
دوشنبه 14 دی 1394, 14:48 عصر
کسی نیست راهنمایی کنه؟:ناراحت:
رابطه ی بین کلاس یک و دو را مشخص کردید اما دقیق مشخص نکردید کلاس سه چه رابطه ای با این دو دارد.اگر فرض کنیم که در کلاس دو شما یک شی از کلاس 3 تعریف کرده اید و حال در این شی می خواهید به متغیر شی کلاس 1 دسترسی داشته باشید برای این کار بایستی به طریقی به آدرس این شی دسترسی داشته باشید که این آدرس می تواند از طریق تابع constructorدر هنگام تعریف شی کلاس 3 به دست این کلاس برسد و اگر در این کلاس یک پوینتر به کلاس یک تعریف کرده باشید می توانید آدرس شی یک موردنظر را به این پوینتر بدهید.آنگاه به setter و getter هم مسلما دسترسی دارید. راه دیگری که به خاطرم می آید که البته با توجه به موقعیت می تواند کاربرد داشته باشد این است که متغیر خودتان را بصورت استاتیک در کلاس یک تعریف کنید که در این صورت بدون ایجاد شی از این کلاس می توانید به آن مقدار دهید یا بخوانید و در همه جا و در همه ی اشیا از کلاس یک هم یکی می باشد.
پی نوشت :تجربه بنده در برنامه نویسی شی گرایی زیاد نیست و مطمئنا اساتید زیادی در این بخش هستند که بهتر می توانند کمک کنند اکتفا کردن به جواب بنده ممکن است جالب نباشد اما امیدوارم که تونسته باشم در محضر اساتید درست درس پس داده و به شما کمک کرده باشم.
پی نوشت2:دوستان اگر اشکالی در جواب من و یا راه حل بهتری برای این سوال دوستمون به نظر می رسد لطفا از گفتن آن دریغ نفرمایید.

arashz4
سه شنبه 15 دی 1394, 11:28 صبح
من مشکلم حل شد این را حل رو اینجا میزارم اگر کسی نیاز داشت به کاربگیره


class1.h

#ifndef CLASS1_H
#define CLASS1_H

#include <QString>

class Class1
{
public:
Class1();

static QString getText();
static void setText(const QString &value);

private:
static QString text;
};

#endif // CLASS1_H


class1.cpp

#include "calss1.h"


QString Class1::text;

Class1::Class1()
{

}

QString Class1::getText()
{
return text;
}

void Class1::setText(const QString &value)
{
text = value;
}

خب حالا از هر کلاسی میشه مقدار داد و از هر جا گرفت

Class1::setText("myText");
qDebug()<<Class1::getText();