2014-05-22 32 views
1

我試圖從另一個類中存儲第一個指針的類方法綁定,但它總是給我不同的值。 我在做什麼錯?C++功能:通過指針綁定類方法

如果我按值傳遞類A(當然修改類B按值存儲)它是可行的。

#include <iostream> 
#include <functional> 

using namespace std; 

class A { 
public: 
    A(double a, double b) : a(a), b(b) {} 
    double mul(void) {return a*b;} 

private: 
    double a; 
    double b; 
}; 

class B { 
typedef std::function<double(void)> function; 

public: 
    B(A* ap) : ap(ap) {} 

    function a_mul = bind(&A::mul, ap); 

private: 
    A* ap; 
}; 

int main() { 
    A* a = new A(2,3); 
    B b(a); 

    cout << b.a_mul() << endl; 

    return 0; 
} 
+0

a_mul不能像這樣內聯初始化,所以我認爲這不是你正在運行的確切代碼。除了a_mul初始化,它看起來沒問題。所以這個問題必須存在於沒有被顯示的東西中...... – dlf

+1

@dlf「a_mul不能像這樣內聯初始化」是的,歡迎來到C++ 11。 –

+0

@ n.m。整齊!但顯然不是微軟的(2012)C++ 11。 :( – dlf

回答

4

您正在使用非靜態數據成員初始值設定項來初始化a_mul。初始值取決於ap的值。但是,ap的定義跟a_mul的定義相同。這意味着a_mul將在初始化之前在構造函數中初始化爲ap。在發生啓動時,ap具有不確定的值,因此您的代碼具有未定義的行爲。解決這個問題

一種方法是更改​​訂單成員變量的定義:

class B { 
typedef std::function<double(void)> function; 

public: 
    B(A* ap) : ap(ap) {} 

    A* ap; 
    function a_mul = bind(&A::mul, ap); 
}; 

但是一個更好的解決將是重新排序的數據成員,初始化在構造函數的初始化列表a_mul

class B { 

typedef std::function<double(void)> function; 

private: 
    A* ap; 

public: 
    B(A* ap) : ap(ap), a_mul(bind(&A::mul, ap)) {} 

    function a_mul; 
}; 
+0

非常感謝您的回答,那就是解決方案! – mooattyi