Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 13 kết quả

Đề tài: Namespace cho newbie C++

  1. #1
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mặc định Namespace cho newbie C++

    I. Giới thiệu về Namespace :
    Namespace là 1 đặc trưng của ANSI C++, nó cho phép người lập trình có thể tạo ra 1 scope cho những tên biến toàn cục (global identifier). Và tất nhiên chúng rất hữu dụng trong việc bắt lỗi khi mà 2 hay nhiều khai báo là cùng tên của biến cục bộ.
    Ví dụ, giả sử bạn là 1 người lập trình trong 1 cty accounting. Cty của bạn mua 2 thư viện của C++ code từ 1 nhà bán phần mềm. Một thư viện dùng để xử lý các account của khách hàng, cái này dùng để chứa các class object có tên gọi là "payable" chẳng hạn. Và 1 thự viện khác dùng để thiết kế để thao tác các tác vụ như phiếu trả tiền(payrall)...etc, và ngặt 1 cái là cái này cũng có 1 class object có cùng tên "payable". Bạn phải viết 1 chương trình để xài được cả 2 thư viện này, nhưng complier sẽ chắc chắn báo lỗi vì 2 class object này có cùng tên. Trong khi bạn lại không thể chỉnh sữa các thư viện này được vì nhà cung cấp cho bạn không bán cho bạn "source code" chỉ có libary object code( chẳng lẻ tiêu sao^^).
    Namespace "superman" xuất hiện, và thế là vấn đề được giải quyết hì hì^^.Namespace sẽ đặt vào mỗi thư viện 1 tên riêng biệt. Với 2 tên riêng biệt này thì nó được dùng để nhận diện các thành viên của nó. Ví dụ, "payable" object là 1 phần của "customer account" thư viện, thì nó có thể có tên là namespace customer, trong khi đó object mà thuộc thư viện paroll thì có tên là namespace payroll.Khi mà chúng ta làm việc với những object, chúng ta phải chỉ rõ ra rằng thành viên nào thuộc namespace nào, chúng ta sẽ dùng scope resolution operator ::. Cái này tương tự y chang như using namespace std của iostream, thì bây h giả sử ta có
    PHP Code:
     using namespace customer
    Thì khi ta dùng nó ta sẽ dùng như sau ví dụ :
    PHP Code:
     customer::... 
    Hơn thế nữa, cái câu lệnh trên sẽ chỉ cho complier nó biết rằng cái soure files mà dùng những thành viên nào của customer namespace.
    II.Cách định nghĩa 1 namespace:
    PHP Code:
    namespace tên;
    {
      ......

    Ví dụ đơn giản :
    PHP Code:
    #include <iostream>
    using namespace std;

    namespace 
    test
    {
        
    int xy;
    }

    int main()
    {
        
    test::10;
        
    test::20;
        
    cout << "x : " << test::<< endl;
        
    cout << "y : " << test::<< endl;

        return 
    0;


    Output
    Code:
    x : 10
    y : 20
    Press any key to continue . . .
    Bây h ví dụ này sẽ cho thấy vấn đề trùng tên mà ta đã đề cập ở trên .
    PHP Code:
    #include <iostream>
    using namespace std;

    namespace 
    test1
    {
        
    int x;
    }
    namespace 
    test2
    {
        
    int x;
    }

    int main()
    {
        
    test1::10;
        
    test2::20;
        
    cout << "x : " << test1::<< endl;
        
    cout << "y : " << test2::<< endl;

        return 
    0;

    Output
    Code:
    x : 10
    y : 20
    Press any key to continue . . .
    III.Ví dụ khác và cách dùng using với namespace:
    nsdemo.h
    PHP Code:
    namespace demo
    {
        class 
    NsDemo
        
    {
        public:
            
    int xyz;
        }; 
        
    NsDemo testObject;
     } 
    main.cpp
    PHP Code:
    #include <iostream>
    #include "nsdemo.h"
    using namespace std;
    using namespace demo;

    int main()
    {
        
    testObject.10;
        
    testObject.20;
        
    testObject.30;
        
    cout << "The values are:\n"
             
    << testObject.<< " "
             
    << testObject.<< " "
             
    << testObject.<< endl;

        return 
    0;

    Dùng using namespace demo; thì ta không cần phải dùng cái toán tử resolution scope nữa (demo: vì complier nó sẽ tự động dựa vào cái tên demo mà nó tìm đúng tên biến của nó.

  2. #2
    Ngày gia nhập
    07 2007
    Nơi ở
    Sơn La
    Bài viết
    133

    Cảm ơn rox_rock nhiều.
    Tiện đây cho hỏi cái này nhé:
    #include "nsdemo.h"
    using namespace std;
    using namespace demo;
    Làm thế nào để ở trên ta không phải #include " nsdemo.h"?
    Vì bên topic kia , bạn nói là không dùng .h nữa.
    Có phải ta phải khai báo một cái thư viện tĩnh không?
    Nói túm lại là chỉ cần #include "nsdemo"
    using namespace demo;// # như là std vậy.
    Trao đổi kiến thức sẽ giúp ta tiếp cận nhanh với kiến thức.

  3. #3
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    haha! Không dùng .h cho iostream thôi ^^ ! NT hiểu nhầm rùi, file class hay file phụ phải có .h chứ không thì làm sao nó hiểu mà import qua^^!

  4. #4
    Ngày gia nhập
    07 2007
    Nơi ở
    Sơn La
    Bài viết
    133

    @ rox_rock :
    Vậy tôi hỏi bạn nhé.
    Vậy khi dùng các hàm tính toán tì phải
    #include <complex>
    using namespace std;
    Vậy mấy cái thư viện iostream,complex... thì nó tạo như thế nào?
    Nếu bạn biết và đang rảnh thì trả lời giùm tôi với nhé.
    Thanks.!

    @ mems:
    Bổ xung ở trên một chút, cái namespace nếu mọi người không thích thì có thể định nghĩa lại bằng #define type_name namespace trong cái header.h
    Nói chung là cho nó dễ nhớ chút đỉnh ấy mờ.
    Trao đổi kiến thức sẽ giúp ta tiếp cận nhanh với kiến thức.

  5. #5
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    @ rox_rock :
    Vậy tôi hỏi bạn nhé.
    Vậy khi dùng các hàm tính toán tì phải
    #include <complex>
    using namespace std;
    Vậy mấy cái thư viện iostream,complex... thì nó tạo như thế nào?
    Nếu bạn biết và đang rảnh thì trả lời giùm tôi với nhé.
    Thanks.!
    Hiểu ý NT rùi ! hì hì ! Công nhận bạn có so sánh và đặt ra 1 câu hỏi rất tinh tế, nhưng cái này thì mình cũng không rõ lắm, để mình đọc sách kiếm thử coi sao.

  6. #6
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mặc định Namespace cho newbie C++

    Hic, cái hồi nãy .h mà mình nói cần thiết là sai rùi, mình với vừa thử xong, extension là gì cũng được nhưng chắc cũng có 1 và trường hợp đặt biệt là không được mà mình nghĩ chắc là .exe ...
    #include
    Thằng này là bộ tiền xử lý, nó sẽ tạo ra 1 bản sao của 1 file nào đó và nó được chèn vào nơi mà thằng này được khái báo. Nên nhớ là thằng này luôn được chạy trước khi complier sẽ bắt đầu nha .
    Có 2 loại là :
    #include <filename>
    #include "filename".
    Sự khác biệt giữa chúng chỉ là vị trí mà thằng tiền xử lý dùng để tìm kiếm chúng mà thôi. Nếu nó là <> thì nó được dùng cho standard library header file(các hearder chuẩn )thường thì mình cài đặt nó chỗ nào nó sẽ vào trong đó tìm. Còn thằng " " thì thằng tiền xử lý nó sẽ vào chỗ của thăng file được complied tìm trước sau đó nó mới tìm tới chỗ mà mình qui định cho nó.
    Có vậy thui à ^^!

  7. #7
    Ngày gia nhập
    07 2007
    Nơi ở
    Sơn La
    Bài viết
    133

    Hai cái đó thì tôi biết rồi cái <> và cái "".
    Còn cái iostream và complex không có .h là theo tôi nghĩ thì cứ để nó mặc định là file không đặt cho nó cái phần mở rộng .h hoặc .xxx gì đó( he he . exe vẫn được hoặc .se.. cũng được ).
    Bạn thử vô include ở VC++ mà xem.
    Open cái complex bằng nodepad lên mà xem.
    Tôi nghĩ nó không có.h hoặc cái gì là vì vậy.(Nếu trình biên dịch tìm kiếm một tệp không có phần mở rộng với một cái có phần mở rộng thì cái nào nhanh hơn???)
    Đã được chỉnh sửa lần cuối bởi NT_OnlyLove : 13-01-2008 lúc 04:24 PM.
    Trao đổi kiến thức sẽ giúp ta tiếp cận nhanh với kiến thức.

  8. #8
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Thư viện chuẩn thì ko cần .h, compiler vẫn có thể tìm được, có lẽ là compiler có sẵn danh sách các thư viện chuẩn.
    Thư viện tự tạo thì cần .h để compiler xác định file.

  9. #9
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Lưu ý: Hỏi chen ngang thế này là Vi phạm đó nha. Đáng ra Dr không có trả lời các bài viết vi phạm, nhưng chiếu cố vì thấy nhiều người quen hỏi ngang thế này quá, ép cũng không xong.
    Nếu hỏi như thế này, đề tài sẽ bị kéo dài, người xem rất khó theo dõi. Bây giờ rox_rook thêm một bài hướng dẫn tiếp bài trên, các bạn quan sát sẽ biết ngay thế nào.

    #include<>, hiểu theo tiếng Việt Nam là Gộp thêm. Ở đây là gộp thêm Nội dung của nó.
    Nếu là #include<iostream> là gộp thêm file iostream
    Nếu là #include<iostream.h> là gộp thêm file iostream.h

    Xem hình này:


    Và đây là hình chụp ở Linux của GCC.


    Xem xong 2 hình trên hiểu ngay tại sao lại có .h và không có .h
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  10. #10
    Ngày gia nhập
    09 2007
    Bài viết
    4

    bạn hướng dẫn thêm nữa đi cụ thể hơn nữa
    khi sử dụng namespace tạo file .h bên trong nó chứa các hàm chứ hok phải là các tham biến

Các đề tài tương tự

  1. newbie cân hỏi
    Gửi bởi MrShin trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 25-06-2012, 12:21 AM
  2. The type or namespace name 'Tcp' does not exist in the namespace 'System.Runtime.Remoting.Channels'
    Gửi bởi nguyenminh1190 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 04-05-2012, 09:01 PM
  3. Bài tập C Vấn đề Newbie không hiểu
    Gửi bởi ngonthian trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 23-04-2012, 11:06 PM
  4. newbie cần hỏi về C
    Gửi bởi dmit8a trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 29-11-2007, 10:48 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn