2014-01-09 117 views
1

我知道我的問題是非常不聰明的問題,但我只是想知道你的建議流量控制與C++

我想有方法如下

void ClassABC::someMethod(){ 

    // portion 1 
    . 
    . 
    . 
    return ; 

    // portion 2 
    . 
    . 
    . 
    . 
    return; 

    // portion 3 
    . 
    . 
    . 
    . 
    return; 
} 

部分1將運行當第一次調用someMethod()時。

部分2將在第二次調用someMethod()時運行。

部分3將在第三次調用someMethod()時運行。

我知道我可以有全局變量/私人對象的變量來檢查哪個部分運行,但只是想聽到你呢! , 你可以申請「goto」聲明,以及

謝謝&最佳Regrads。 Puwanat S.

+0

「......在第一次調用someMethod()時運行」 - 第一次爲對象實例還是第一次爲類?即你有'ClassABC a,c; a.someMethod(); b.someMethod();' - 應該'b.someMethod();'運行部分1或2? –

+0

@Tony D,第一次對象實例 – Denny

回答

4
void ClassABC::someMethod() { 
    static size_t counter = 0; 

    switch (counter++) { 
     case 0: { 
      // 1 
      break; 
     } 
     case 1: { 
      // 2 
      break; 
     } 
     default: { 
      // 3 
      break; 
     } 
    } 
} 

請注意,此方法只適用於static成員函數。

對於非靜態成員函數使用:

class ClassABC { 
public: 
    ClassABC(); 
    void someMethod(); 
private: 
    size_t someMethodCounter; 
} 

ClassABC::ClassABC() { 
    this->someMethodCounter = 0; 
} 

void ClassABC::someMethod() { 
    switch (this->someMethodCounter++) { 
    // ... 
    } 
} 
0

取決於什麼是最有意義的。你也可以做

void ClassABC::someMethod1() { ... } 
void ClassABC::someMethod2() { ... } 
void ClassABC::someMethod3() { ... } 

相反,雖然調用者(s)將不得不稍微更多地意識到他們的上下文。

或者,它可以做

int ClassABC::someMethodIndex; 
void ClassABC::someMethod() 
{ 
    switch (someMethodIndex) 
    { 
    case 0: ... // first portion 
       someMethodIndex = 1; // next time do portion 1 
       return; 
    case 1: ... // second portion 
       someMethodIndex = 2; // next time do portion 2 
       return; 
    case 2: ... // third portion 
       someMethodIndex = 0; // next time do portion 0 
       return; 
    } 
} 
0

如果算上在類的所有對象,你可以使用靜態數據成員:http://msdn.microsoft.com/en-us/library/b1b5y48f.aspx

這是從視圖封裝點不是全局好得多變量。

如果您分別計算類的每個對象,只需使用一個普通的私有成員變量來存儲計數器。

0

使用計數器變量和switch聲明:

switch(counter++) { 
case 0: 
    // portion 1 
    break; 
case 1: 
    // portion 2 
    break; 
case 2: 
    // portion 3 
    break; 
... 
} 
0

您可以初始化爲零的方法內的靜態變量,每次調用都會增加,並決定調用代碼的適當部分。

2

在嵌入式系統中,我們將使用函數指針。它通常比switch語句具有更低的開銷,特別是如果一個案例要重複運行。

void ClassABC 
{ 
    void part1() { 
    // portion 1 ; 
    op_= part2 ; 
    } 
    void part2() { 
    // portion 2 
    op_= part3 ; 
    void part3() { 
    // portion 3 
    } 

    void someMethod() { op_() ; } 

    std::function<void()> op_ = part1 ; 
} ; 
+0

你的回答也很酷! – Denny