2016-04-25 14 views
0

私は、かっこ演算子をオーバーライドするクラスAを持っています。 次のコードは動作します:セグメンテーションフォルトC++、かっこ演算子の後

segmentation fault (core dumped) 

私ができる:

int main(){ 
    .. 
    A a; 
    cout << a({0.5}); 
    .. 
} 

次のコードは、

A fun(){ 
    .. 
    A a; 
    return a; 
    .. 
} 
int main(){ 
    .. 
    A a = fun(); 
    cout << a({0.5}); 
} 

を動作しませんが、私はこの第二のコードを実行すると、私は次のエラーを持っています理由を理解できない。

EDIT:実際に

FFNeuralNetwork_(Features_<InputC, denseOutput>& phi, unsigned int neurons, 
       unsigned int outputs) : 
    ParametricRegressor(phi, outputs), BatchRegressor_<InputC, arma::vec, denseOutput>(phi, outputs) 
{ 
    layerFunction.push_back(new Sigmoid()); 
    layerFunction.push_back(new Linear()); 

    layerNeurons.push_back(neurons); 
    layerNeurons.push_back(outputs); 

    setupNetwork(); 
} 

そして:

virtual arma::vec operator()(const InputC& input) override 
{ 
    const arma::vec& x = params.normalizationF->normalize(Base::phi(input)); 
    forwardComputation(x); 
    return params.normalizationO->restore(h.back()); 
} 

これはコンストラクタです:これは演算子のオーバーライドである

FFNeuralNetworkだった

typedef FFNeuralNetwork_<arma::vec> FFNeuralNetwork; 

クラス 私がこの例で使用したものです。ここで

実際の作業コード:

BasisFunctions basisPlane_ = IdentityBasis::generate(1); 
DenseFeatures phiPlane_(basisPlane_); 
FFNeuralNetwork planeNet(phiPlane_, 10, 1); 
cout << planeNet({0.5}); 

ここで働いていませんコード:

FFNeuralNetwork createNetwork(..){ 
    BasisFunctions basisPlane_ = IdentityBasis::generate(1); 
    DenseFeatures phiPlane_(basisPlane_); 

    FFNeuralNetwork planeNet(phiPlane_, 10, 1); 
    return planeNet; 
} 
.. 
FFNeuralNetwork net = createNetwork(..); 
cout << net({0.5}); 
+2

これを理解するには、 'class A 'のコードを参照する必要があります。 –

+0

それは非常に長いです、私は括弧演算子のオーバーライドを投稿すれば十分だと思いますか? – Samuele

+0

はい、コードを関連する部分にトリムします。私は、コンストラクタも括弧演算子に加えて面白いかもしれないと思う。 –

答えて

2

コードあなたが参照することにより、ローカル変数phiPlane_を渡しているの。このビットで:

FFNeuralNetwork createNetwork(..){ 
    BasisFunctions basisPlane_ = IdentityBasis::generate(1); 
    DenseFeatures phiPlane_(basisPlane_); 

    FFNeuralNetwork planeNet(phiPlane_, 10, 1); // <- HERE 
    return planeNet; 
} 

FFNeuralNetwork net = createNetwork(..); 
cout << net({0.5}); 

関数が参照を渡したオブジェクトを返すと、もはや存在しなくなるので、コードshはありませんその後、それにアクセスしてください。 ParametricRegressor(phi, outputs)で何が起きても問題ないかもしれませんが、私には少し疑わしいようで、あなたの問題を説明することができます。

+0

申し訳ありませんが、私はC++を初めて使っています。返品後にphiPlaneが存在しなくなった理由は何ですか?この問題を解決するにはどうすればよいですか? – Samuele

+0

'phiPlane_'オブジェクトは関数内のローカル(スタック)変数としてのみ存在し、関数が返すとオブジェクトは破棄され、もはや有効ではなくなります。参照(ポインタ)を別の場所に渡して、オブジェクトがなくなった後にそのオブジェクトにアクセスしようとすると、悪いことが起こります。 –

+0

さて、どうすればこの問題を解決できますか? phiPlaneにグローバル変数を使用する必要がありますか?またはより洗練されたソリューションがありますか? – Samuele