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
我不喜歡在巴茲存儲美孚爲指針,但在我的真正的程序,我有經常換出巴茲的向量和參考不能用於那個(不編譯)。如果我使它成爲一個常規成員(不是指針或引用),那麼我沒有問題,但有大量的這些對象最好不要在每個對象中存儲相同的副本,所以我需要使用指針。
謝謝,你是正確的,但在我的非平凡程序中,我實際上使用了一個引用,並且我忘記了在這個簡單化的例子中引用這個引用。這解決了這個例子的問題,所以我需要嘗試重新創建問題作爲一個最小的例子。 – johnbakers
我相信這讓我朝着正確的方向前進。我的問題與您所描述的類似,謝謝。 – johnbakers