我有一个函数指针向量,默认初始化为类成员,所以它总是有2个元素。但是,在阅读size()
时,我会感到胡言乱语。我在下面创建了一个简单的,最小的复制问题。
#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
我不喜欢在Baz中存储Foo作为指针,但在我的真实程序中,我有一个经常换掉的Baz的向量,并且不能使用引用(不编译)。如果我使它成为常规成员(不是指针或引用),那么我没有问题,但是对于大量这些对象,最好不要在每个对象中存储相同的副本,因此指针是我需要使用的。 / p>
答案 0 :(得分:4)
下面:
explicit Baz(Foo f):foo{&f}{}
f
是构造函数的局部变量,一旦构造函数退出就会消失。您可能希望传递引用或实际的原始指针。