物件起始設定元

起始設定函數會起始設定實例的屬性及鏈結。起始設定元假設記憶體已在之前針對物件進行過配置(靜態或動態)。 物件起始設定元名稱格式為 <object>_Init()

例如,下列範例是針對物件 A 所產生的起始設定元原型:

void A_Init(struct A_t* const me);

第一個引數是常數指標,指向已起始設定的物件。const 關鍵字定義 ANSI C 中的常數指標。將常數指標作為引數來傳遞,可讓作業變更指標所指的物件值,但不是引數 me 所包含的位址。

物件起始設定元具有下列責任,並以下列順序執行:

  1. 呼叫子物件起始設定元函數,若物件有子物件的話。
  2. 設定關聯關係的鏈結。
  3. 執行針對建構子主體所輸入的使用者程式碼。 此程式碼必須包括起始設定物件資料。
  4. 起始設定聚集的架構物件(例如,RiCTaskRiCReactiveRiCMonitor 物件)。

子物件起始設定,包括呼叫複合物件之每一個子物件的起始設定元。至於陣列,每一個子物件的起始設定皆包括 $index 關鍵字。

依預設,起始設定元沒有引數(除了 me 引數)。如果您建立具有引數的起始設定元,則可以在「物件」視窗中輸入引數的起始值。針對具有引數的起始設定元,IBM® Rational® Rhapsody® 會從「物件」視窗中所輸入的值產生起始設定碼。

起始設定子物件

利用呼叫母項起始設定元中的 initRelations(),起始設定組合。例如,下列是針對物件 D(內含子物件 E)所產生的起始設定元:

void D_Init(D* const me) {
   initRelations(me);
}

D 起始設定元中的 initRelations() 呼叫,會呼叫 E 的起始設定元:

static void initRelations(D* const me) {
    E_Init(&me->E);
}

如果將子物件實作為陣列(例如,因為子物件的數值對應關係大於 1),則會在 initRelations() 作業中使用 while() 迴圈來起始設定子物件。例如,如果 E 的對應關係是 2,則 E 會實作為 D 中的二元素陣列。下列範例是在 DinitRelations() 作業中產生 while() 迴圈,以起始設定 E 的兩個實例:

static void initRelations(D* const me) {
   E_Init(&(me->E));
   {
      RhpInteger iter = 0;
      while (iter < 5){
         E_Init(&((me->itsE)[iter]));
         iter++;
      }
   }
}

設定鏈結

如果相關的物件不是複合物件的元件,您可以讓主程式實例化其中一個物件,方法是將該物件選取作為起始實例(在配置的「起始設定」標籤中)。 在物件的起始設定元中,您可以明確建立相關的物件,然後設定其鏈結。例如,如果物件 A 及物件 B 是相關的,main() 函數將 A 實例化作為起始實例,則在 A 的起始設定元主體中,您可以撰寫下列程式碼將其鏈結設定連至 B

B *itsB = B_Create();
A_setItsB(me, itsB);

將鏈結設為連至對多關係,會呼叫儲存器的起始設定元。在下列程式碼中,對 RiCCollection_Init() 的呼叫會將 Furnace 的鏈結設為連至三個 itsRooms。將值 RiCTRUE 傳遞至 RiCCollection_setFixedSize(),表示集合是固定大小。

void Furnace_Init(Furnace* const me, RiCTask * p_task) {
    RiCReactive_init(&me->ric_reactive, (void*)me, 
        p_task, &Furnace_reactiveVtbl);
    RiCCollection_Init(&me->itsRoom, 3);
    NOTIFY_REACTIVE_CONSTRUCTOR(me, NULL, Furnace,
        Furnace, Furnace(), 0, Furnace_SERIALIZE);
    {
        RiCCollection_setFixedSize(&me->itsRoom,
            RiCTRUE);
    }
    initStatechart(me);
    NOTIFY_END_CONSTRUCTOR(me);
}

NOTIFY_CONSTRUCTOR()NOTIFY_END_CONSTRUCTOR() 呼叫是啟用動畫時所產生的檢測巨集。第一個巨集會通知動畫程式(在呼叫起始設定元之後)以及建立動畫實例。當起始設定元即將結束時,第二個巨集會通知動畫程式。

執行使用者起始設定碼

建構子的使用者程式碼包括物件屬性的起始設定。您可以在物件建構子中指定每一個參數的實際值。實際值是逐字插入作為未解譯文字。

在程式碼中的 /*#[/*#] 符號之間產生使用者程式碼。例如,您可以針對起始設定元在實作欄位中輸入下列程式碼:

RiCString temp;
RiCString_Init(&temp, "Hello World");
A_print(me, temp);

此程式碼實作如下:

void A_Init(struct A_t* const me) {
    NOTIFY_CONSTRUCTOR(me, NULL, A, A, A(), 0,
        A_SERIALIZE);
    me->itsB = NULL;
    {
        /*#[ operation A() */
        RiCString temp;
        RiCString_Init(&temp, "Hello World");
        A_print(me, temp);
        /*#]*/
    }
    NOTIFY_END_CONSTRUCTOR(me);
}

意見回饋