PDA

View Full Version : سوال: تشریح فضای نامی(name space)



...StacK...
یک شنبه 01 دی 1387, 22:53 عصر
سلام
من c رو بلدم و حالا دارم روی c++ کار میکنم و حالا که تو یک کتاب c++ استاندارد

نوشته برای استفاده از cout و cin باید دستور


using namespace std;

رو اضافه کنم ولی کامپایلر بهم اشکال میگیره....علت چیه؟؟؟

و موقعی که از

using std::cout;
using std::cin;
using std::endl

استفاده میکنم مشکلی پیش نمیاد.

ما در c برای ورودی خروجی هدر stdio رو اضافه میکردیم و از توابع اون استفاده میکردیم

ولی cin و cout و از این قبیل دستورات در c++ که تابع نیستند پس کارکردشون به چه صورت

هست؟؟؟

اصلا چرا باید using std::x رو اضافه کنیم ...با این کار اون دستوری که ازش استفاده میکنیم

چی را میخواد بفهمه و به کجا رجوع میکنه تا اینکه حالا ورودی /خروجی رو انجام بده؟؟

و همینطور using namespace std;؟؟؟؟

و یه سوال دیگه منظور از اینکه استفاده از دستور endl; به جای n\ باعث میشه که

علاوه بر رجوع به خط بعد بافر رو هم خالی کنه ...منظور از بافر , بافر کیبورد هست؟یا...؟؟

...StacK...
دوشنبه 02 دی 1387, 17:19 عصر
دوستان سوالم که مورد دار نبود؟؟؟

A_Salimi
دوشنبه 02 دی 1387, 21:36 عصر
ولی کامپایلر بهم اشکال میگیره....علت چیه؟؟؟

نسخه كامپایلرتون چیه ؟ امیدوارم از نسخه های قدیمی استفاده نکرده باشید.


ما در c برای ورودی خروجی هدر stdio رو اضافه میکردیم و از توابع اون استفاده میکردیم
ولی cin و cout و از این قبیل دستورات در c++ که تابع نیستند پس کارکردشون به چه صورت
هست؟؟؟

در حقیقت namespace می تواند فضاهای عمومی را به فضاهای کوچکتری تقسیم کند و هدف آن محلی کردن شناسه هاست.


اصلا چرا باید using std::x رو اضافه کنیم

چون namespace يك حوزه را تعريف مي كند در خارج از اين حوزه براي دسترسي به شناسه هاي آن بايد از عملگر :: استفاده کرد.
برای دستیابی به شناسه های موجود در یک فضا باید از عملگر :: استفاده کرد اما اگر تعداد دستیابی ها زیاد باشد این کار چندان جالب نیست و برای رفع مشکل از using استفاده می کنیم.

h_motamed123
سه شنبه 03 دی 1387, 14:52 عصر
من در یکی از جزوات اساتید رایانه اینجور خوندم
فضای نام که ما استفاده میکنیم نه لزومن برای محدود کردن فضا بلکه برای راحت کردن برنامه نویسان برای تولید رده های مورد نظر وجدیدشان است وبرای دسترسی ساده تر ودقیقتر به انها است.

Nima_NF
سه شنبه 03 دی 1387, 21:32 عصر
namespace ها را به شکل زیر تعریف می توان کرد و داخل آن می توان انواع توابع، متغیر ها، کلاس ها و ... را تعریف کرد:



#include <iostream>
using namespace std;

namespace MyMath
{
// variables
// Functions
// classes
// ...
}

namespace MyGraphic
{
// variables
// Functions
// classes
// ...
}

int main()
{
int value= MyMath::rectangle(0,0,10,10);

MyGraphic::rectangle(0,0,10,10);
return 0;
}



همانطور که می بینید به راحتی مثلا می توان توابع هم نام، متغیر های هم نام و ... را تعریف کرد که کارهای متفاوت از هم انجام می دهند، چرا که تا فضای نامی آن را با :: مشخص نکنید نمی توانید به آن دسترسی داشته باشید. (البته این پیاده سازی ها معمولا باید در فایل های جداگانه نوشته شود، مخصوصا وقتی کد ما به عنوان یک کتابخانه برای استفاده دیگران باشد)

در پروژه های بزرگ کمک می کند تا اگر هم تابعی همنام با یکی از هزاران API و توابع استاندارد نوشتیم تداخلی ایجاد نکند و دقیقا کد ما ایجاد شود.

اگر هم می دانید که در فایلی همنام نخواهند بود، به راحتی بالا صفحه با namespace تعریف کنید تا در کل فایل (فقط همان فایل) بدون در نظر گرفتن فضا همه را بشناسد:



using namespace MyGraphic;
using namespace MyMath;