6. Quy tắc chuyền tham số
6.7 Truyền tham số tham chiếu đối tợng
Tham chiếu đối tợng là kiểu có độ dài thay đổi bởi vì nó tơng tự con trỏ. Quy tắc truyền tham số của chúng tơng tự đối với kiểu string.
VD:
Interface Foo{ Foo ref_op(
Inout Foo ref_inout; Out Foo ref_out; );
void say_hello(); };
Lớp Skeleton:
Class POA_Foo: public virtual Portable Server:: Servant Base { Public:
Virtual Foo_ptr ref_op( Foo_ptr ref_in;
Foo_ptr & ref_inout; Foo_out ref_out; )throw (CORBA::SystemException)=0; // }; Cài đặt ref_op Foo_impl::
Say_hello() throw (CORBA: System Exeption) { cout<< hello <<endl;” ”
}
foo_ptr Foo_impl::ref_op( Foo_ptr ref_in;
Foo_ptr ref_inout; Foo_out ref_out;)
// sử dụng ref_in if (!CORBA::is_nil(ref_in)){ ref_in->say_hello(); } //sử dụng ref_inout if (!CORBA::is_nil(ref_inout)){ ref_inout->say_hello(); }
// thay đổi ref_inout
CORBA::release (ref_inout); Ref_inout=_this();
// khởi tạo ref_out
foo_imp* new_servant=new Foo_impl; ref_out=new=new_servant->_this(); // tạo giá trị trở về
return Foo::_nil();
• Quản lý bộ nhớ của phơng thức servant
• Tham số vào ref_in đợc truyền theo trị. Chú ý rằng nó là 1 tham chiếu đối tợng và không đối tợng mà nó tham chiếu tới nó đợc truyền cho phơng thức servant. Nếu nó bằng nill ref_in có thể sẽ đợc dùng để gọi thao tác trên đối tợng đợc tham chiếu. Chơng trình chỉ sử dụng tham chiếu đối tợng và không phải có trách nhiệm quản lí
Thao số vào ra ref_inout đợc truyền theo kiểu tham chiếu cho phép đối tợng truy nhập giá trị và thiết lập giá trị mới cho CRB và thời gian chạy để gửi lại client. Chơng trình phải release tham chiếu đối tợng vào trớc khi thiết lập nó giá trị mới. Trong ví dụ đối tợng thiết lập ref_inout tới tham chiếu đối tợng đích, thu đợc qua lời gọi hàm _this. Giá trị hàm this phải đợc release bởi lời gọi vì vậy bằng việc gán nó cho ref_inout chúng ta truyền thực sự trách nhiệm tới lời
Tham số ra đợc truyền nhờ 1 for+out cho đối tợng đợc for_ptr. Nó đợc khởi tạo và truyền vào chơng trình phải khởi tạo nó với một tham chiếu đối tợng Foo nil hoặc không nil. Tham chiếu đối tợng chúng ta gán cho tham số ref _out trở thành đảm nhiệm cuả lời gọi.
Khối catch ngăn chặn việc toàn bộ ứng dụng bị huỷ bỏ. Nó còn ngăn ứng dụng client không nhận các ngoại lệ ngời dùng định nghĩa mà không đợc khai báo trong mật độ raises
Trong ví dụ chơng trình khởi tạo một tham số ra bằng việc tạo 1 servant Foo_impl và dùng hàm this của nó để tạo đối tợng CORBA mới. Sau đó gán
giá trị trả về của các hàm this cho ref_out chuyển cho lời gọi hàm có trách
nhiệm cho việc release nó .
Chú ý Servant không đợc tạo trên stack nếu không nó có thể bị phá huỷ sau khi lệnh cuối cùng của phơng thức servant đợc thực hiện bỏ lại con trỏ đợc đăng kí bởi POA.
Thay vì đó , chúng ta cấp phát trên vùng nhớ heap . Cho đến một thời điểm nào đó chúng ta phải xoá nó để giải phóng bộ nhớ
Việc xử lý tham chiếu trả về cũng nh xử lý tham chiếu ra . Lời gọi có trách nhiệm release tham chiếu trả về trong ví dụ lời gọi Foo::_nil() trả về một tham chiếu nil .
Tham chiếu đợc chuyền vào có kiểu Foo_ptr mà không phải kiểu const
Foo_ptr& vì IDL cung cấp một hoạt động khai báo không đợc hiệu chỉnh trạng thái của đối tợng, nói cách khác IDL là ngôn ngữ khai báo nó không phụ thuộc vào ngôn ngữ lập trình cụ thể nào, vì vậy trạng thái của đối tợng không đợc chỉ định trong IDL. Bởi vì trong tham chiếu đối tợng đợc truyền bởi trị.