[英]accessing a static map from a static member function - segmentation fault - 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.