gpt4 book ai didi

c++ - fn 指针的 vector 未显示正确的大小()

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:23 25 4
gpt4 key购买 nike

我有一个默认初始化为类成员的函数指针 vector ,所以它总是有 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

我不喜欢将 Foo 作为指针存储在 Baz 中,但在我的实际程序中,我有一个经常换出的 Baz vector ,并且不能为此使用引用(不编译)。如果我使它成为常规成员(不是指针或引用),那么我没有问题,但是对于大量这些对象,最好不要在每个对象中存储相同的拷贝,所以我需要使用指针。

最佳答案

这里:

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

f 是构造函数的局部变量,一旦构造函数退出就会消失。您可能想传递一个引用,或者一个实际的原始指针。

关于c++ - fn 指针的 vector 未显示正确的大小(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42214702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com