2017-02-13 41 views
2

我有一個函數指針向量默認初始化爲一個類成員,所以它總是有2個元素。但是,當閱讀其size()時,我得到的是亂碼。我在下面創建了一個微不足道的,最小的複製問題。fn指針的向量不顯示正確的大小()

#include <iostream> 
#include <vector> 

using fnptr = float (*)(float); 

float fn1(float x){ return x;}; 
float fn2(float x){ return x;}; 

std::vector<fnptr> fnptrs(){ 
    std::vector<fnptr> ret; 
    ret.push_back(&fn1); 
    ret.push_back(&fn2); 
    return ret; 
} 

class Foo{ 
public: 

    int nFns()const{ 
    return fns.size(); 
    } 

private: 
    std::vector<fnptr> fns = fnptrs(); // always initialized 
}; 


class Baz { 
public: 
    explicit Baz(Foo f):foo{&f}{} 

    const Foo* foo; // my problem does not appear if this is not a pointer 

}; 

class Bar { 
public: 
    explicit Bar(Foo f):foo{f}{ 
    bazs.push_back(Baz(foo)); 
    bazs.push_back(Baz(foo)); 
    } 

    void viewSizes()const{ 
    for (auto& i:bazs) 
     std::cout << " i.foo->nFns() = " << i.foo->nFns() << "\n"; 
    } 

    const Foo foo; 
    std::vector<Baz> bazs; 

}; 

int main(int argc, const char * argv[]) { 

    Foo f; 
    Bar b(f); 

    b.viewSizes(); 

    return 0; 
} 

輸出:

i.foo->nFns() = -677271344 
i.foo->nFns() = -516 

我不喜歡在巴茲存儲美孚爲指針,但在我的真正的程序,我有經常換出巴茲的向量和參考不能用於那個(不編譯)。如果我使它成爲一個常規成員(不是指針或引用),那麼我沒有問題,但有大量的這些對象最好不要在每個對象中存儲相同的副本,所以我需要使用指針。

回答

4

這裏:

explicit Baz(Foo f):foo{&f}{} 

f是構造函數的局部變量和蒸發一次構造退出。你可能想要傳遞一個引用,或者一個實際的原始指針。

+0

謝謝,你是正確的,但在我的非平凡程序中,我實際上使用了一個引用,並且我忘記了在這個簡單化的例子中引用這個引用。這解決了這個例子的問題,所以我需要嘗試重新創建問題作爲一個最小的例子。 – johnbakers

+0

我相信這讓我朝着正確的方向前進。我的問題與您所描述的類似,謝謝。 – johnbakers