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(
In Foo ref_in;
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;)
Thow (CORBA: system Exception) // 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
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 gọi của chương trình
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ị.