簡體   English   中英

static 成員中的段錯誤 function c++

[英]Segmentation fault in static member function c++

class Adder {
public:
    static int Solve(int a, int b) {return a + b;}
};

class Substructor {
public:
    static int Solve(int a, int b) {return a - b;}
};

class Comparer {
public:
    static bool Solve(int a, int b) {return a < b;}
};

class If {
public:
    static int Solve(bool term, int a, int b) {return term ? a : b;}
};

class Fibo {
public:
    static int Solve(int num) {
      int res =
      If::Solve(
        Comparer::Solve(num, 2),
        1,       
        Adder::Solve(
          Fibo::Solve(Substructor::Solve(num, 1)),
          Fibo::Solve(Substructor::Solve(num, 2))
        )
        
      );
      return res;
    }
};

int calc(int x) {
  return Fibo::Solve(x);
}

#include <iostream>
int main() {
  std::cout << calc(5) << '\n';
  return 0;
}

此代碼導致分段錯誤。 我分別測試了所有類,編寫遞歸 fibo static 成員 function 沒有其他 static 成員函數並且它有效。 結合時它會粉碎。 如何修復它以及為什么它會壓碎?

問題出現在這里:

class Fibo {
public:
    static int Solve(int num) {
      int res =
      If::Solve(
        Comparer::Solve(num, 2),
        1,       
        Adder::Solve(
          Fibo::Solve(Substructor::Solve(num, 1)),
          Fibo::Solve(Substructor::Solve(num, 2))
        )
      );
      return res;
    }
};

If::Solve()語句中,如果Comparer::Solve(num, 2)檢查 num<2,返回 1 並且不計算剩余的表達式Fibo::Solve(Substructor::Solve(num, 1))和第二個,它不會像你預期的那樣工作。 要評估If::Solve() ,必須先評估每個 arguments 才能傳遞給If::Solve() 當它一次又一次地遞歸計算時,發生堆棧溢出,因此程序終止。 如果你真的想讓它運行,修改如下:

class Fibo {
public:
    static int Solve(int num) {
        if (Comparer::Solve(num, 3)) {
            return 1;
        }
        else return Adder::Solve(
            Fibo::Solve(Substructor::Solve(num, 1)),
            Fibo::Solve(Substructor::Solve(num, 2))
        );
    }
};

這保證如果 num 為 1 或 2,則返回 1 並且不計算剩余的表達式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM