2017-02-13 7 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 

私はポインタとしてバズではFooを保存することを好むはありませんが、私の実際のプログラムでは、私は頻繁にスワップアウトされたバズのベクトルを持っていると参照ができませんそのために使用されます(コンパイルされません)。私はそれを通常のメンバ(ポインタまたは参照ではない)にすると問題はありませんが、これらのオブジェクトの数が多いと、すべてのオブジェクトに同じコピーを格納しない方が良いので、ポインタを使用する必要があります。ここで

答えて

4

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

fは、コンストラクタのローカル変数であるとコンストラクタ出ると蒸発します。代わりに、参照や実際の生のポインタを渡したいと思うかもしれません。

+0

ありがとう、あなたは正しいですが、私の非自明なプログラムでは、私は実際にリファレンスを使用しています、そして、私はこのトリビアル化された例でリファレンスを作るのを忘れました。これはこの例題の問題を解決するので、私は最小限の例として問題を改善し、再現する必要があります。 – johnbakers

+0

私はこれが私を正しい方向に向けると信じています。私の問題はあなたの説明に似ていた、ありがとう。 – johnbakers

関連する問題