PDA

View Full Version : مبتدی: دسترسی به متغیرهای Private بدون استفاده از getter



ehsan_faal
شنبه 30 خرداد 1394, 01:08 صبح
سلام.
توی کد زیر توی تعریف سازنده دوم از یکی از داده های خصوصیه آرگومان ورودی استفاده میشه.
مگه توی تعریف یک کلاس فقط داده های خصوصیه مربوط به this رو نمیتونیم استفاده کنیم؟
نباید این آرگومان ورودی داده های خصوصیه خودش رو حفظ میکرد؟
#pragma once
#include <iostream>
using namespace std;
class Array
{
friend ostream &operator<<(ostream &, const Array &);
friend istream &operator>>(istream &, Array &);
public:
Array(int =10);
Array(const Array &);
~Array();
int getSize() const;
const Array &operator=(const Array &);
bool operator==(const Array &) const;
bool operator!=(const Array & right) const
{
return !(*this != right);
}
int &operator[](int);
const int &operator[](int) const;
static int getArrayCount();
private:
int size, *ptr;
static int arrayCount;
};



#include "Array.h"
#include <assert.h>
#include <iomanip>
using namespace std;
int Array::arrayCount = 0;
Array::Array(int arraySize)
{
size = (arraySize > 0 ? arraySize : 10);
ptr = new int[size];
assert(ptr != 0);
++arrayCount;
for (register int i = 0; i < size; i++)
ptr[i] = 0;
}
Array::Array(const Array &init) :size(init.size)
{
ptr = new int[size];
assert(ptr != 0);
++arrayCount;
for (register int i = 0; i < size; i++)
ptr[i] = init.ptr[i];
}

Array::~Array()
{
delete[] ptr;
arrayCount--;
}
int Array::getSize() const
{
return size;
}
const Array &Array::operator=(const Array &right)
{
if (&right!=this)
{
if (size!=right.size)
{
delete[] ptr;
size = right.size;
ptr = new int[size];
assert(ptr != 0);
}
for (register int i = 0; i < size; i++)
ptr[i] = right[i];
}
return *this;
}
bool Array::operator==(const Array &right)const
{
if (size!=right.size)
return false;
for (register int i = 0; i < size; i++)
if (ptr[i] != right[i])
return false;
return true;
}
int &Array::operator[](int index)
{
assert(0 <= index && index < size);
return ptr[index];
}
const int &Array::operator[](int index) const
{
assert(0 <= index && index < size);
return ptr[index];
}
int Array::getArrayCount()
{
return arrayCount;
}
istream &operator>>(istream & input, Array & Dest)
{
for (register int i = 0; i < Dest.size;i++) // friend can access to private member of Objects.
{
input >> Dest[i];
return input;
}
}
ostream &operator<<(ostream & output, const Array & Source)
{
register int i=0;
for (; i < Source.size;i++)
{
output << setw(12) << Source[i];
if ((i + 1) % 4 == 0)
{
output << endl;
}
if (i%4!=0)
{
output << endl;
}
}
return output;
}

#include <iostream>
#include "Array.h"
using namespace std;

void main()
{
Array a(8);
Array b(a);
}

ممنون میشم یه توضیحی بدید.

chikar
شنبه 30 خرداد 1394, 02:36 صبح
بله عناصر خصوصی هر کلاس فقط درون خود همون کلاس و یا جاهای دیگه مثل تابع دوست قابل استفاده است، پس اگه ده تا شی از یک کلاس (دقت کنید از یک کلاس) باشند، همگی درون کلاس (دقت کنید درون کلاس) می تونند به عناصر خصوصی خودشون دسترسی داشته باشند ولی اگر دو شی از دو کلاس متفاوت باشند، هر شی فقط می تونه به عناصر خصوصی کلاس خودش دسترسی داشته باشه، تو مثالی که زدید :
a,b هر دو از جنس یک کلاس هستند، پس درون کلاس می تونند به عناصر خصوصی خودشون دسترسی داشته باشند، اگر a از یک کلاس بود و b از یک کلاس متفاوت دیگه بود، اون وقت مثلا شیa نمی تونست درون کلاس مربوط شی b به اعضای خصوصی ش دسترسی پیدا کنه!
حالا یه مثال می زنم شاید بهتر متوجه شید :

class A
{
int pvar;
public:
A(int x) {pvar = ++x;}
A(const A &y) {pvar = 44;std::cout << y.pvar << this->pvar;}

};
void main() {
A a1(99);
A a2(a1);
}
output is :
100 44


ببنید تو مثال بالا اشیاء aوb هر کدوم برای خودشون یک کپی از عناصر دارند، و همچنین شی a از طریق ارجاع به پارامتر ورودی سازنده مربوط به شی b فرستاده شده!
امیدوارم مطلب رو رسونده باشم:لبخند:

amirtork
شنبه 30 خرداد 1394, 02:42 صبح
سلام.
داده های خصوصی در مقابل فراخوانی یا read/write از سمت توایع خارج از کلاس محافظت میشن، اعضای داخلی کلاس و توابع دوست(friend) به اعضای private دسترسی مستقیم دارن.
اگر سوالتون رو اشتباه متوجه شدم عذرخواهی میکنم، اگر میشه یک مقدار واضح تر مطرح کنید. روی کدوم خط مشکل دارید؟

ehsan_faal
شنبه 30 خرداد 1394, 03:03 صبح
سلام.
داده های خصوصی در مقابل فراخوانی یا read/write از سمت توایع خارج از کلاس محافظت میشن، اعضای داخلی کلاس و توابع دوست(friend) به اعضای private دسترسی مستقیم دارن.
اگر سوالتون رو اشتباه متوجه شدم عذرخواهی میکنم، اگر میشه یک مقدار واضح تر مطرح کنید. روی کدوم خط مشکل دارید؟

ممنون.دوست عزیزمون chikar (http://barnamenevis.org/member.php?231853-chikar) جواب منو دادن.
من تا الان فکر میکردم توی یک کلاس فقط میشه داده های خصوصی شی this رو دید،نمیدونستم هر عضوی از همون کلاس رو هم به عنوان پارامتر به یکی از متدها ارسال کنیم رو هم میشه باهاش این کارو کرد.