fn指针的向量没有显示正确的大小()

时间:2017-02-13 22:28:09

标签: c++ pointers

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

1 个答案:

答案 0 :(得分:4)

下面:

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

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