2011-07-15 2 views
0

ヘッダファイルにオブジェクトを宣言すると、コンパイルエラーが発生します。しかし、アプリケーションのsetup()メソッドで、単にAnalyzer A(44100., "a", 200);を呼び出して構築することができます。組み込みタイプのオブジェクトを宣言する際に問題があります

このようにすれば、どのようにポインタを保持できますか?コンストラクタ呼び出しが範囲外になったら、オブジェクトにアクセスできなくなりませんか?

また、このオブジェクトのインスタンスを取得する別の方法がありますか?

(私はA = new Analyzer(44100., "a", 200);を入れて、私のヘッダーにAnalyzer A;のようなものを入れて、その後、CPPにされるのに使用しています何これ、しかし、コンパイルされません。)。

Analyzer.hh:

class Analyzer { 
    public: 
    /// constructor 
    Analyzer(double rate, std::string id, std::size_t step = 200); 
}; 

Analyzer.cc:

Analyzer::Analyzer(double rate, std::string id, std::size_t step): 
    m_step(step), 
    m_rate(rate), 
    m_id(id), 
    m_window(FFT_N), 
    m_bufRead(0), 
    m_bufWrite(0), 
    m_fftLastPhase(FFT_N/2), 
    m_peak(0.0), 
    m_oldfreq(0.0) 
{ 
/* ... */ 
} 

testApp.h:

#include "Analyzer.hh" 

class testApp : public ofSimpleApp{ 
public: 

// *This line gives compilation error 
// "No matching function for call to Analyzer::Analyzer()" 

     Analyzer A; 
    } 

testApp.cpp:

void testApp::setup(){ 

// *This line compiles, but how will I access 
//this object outside of current scope?* 
    Analyzer A(44100., "a", 200); 
} 

答えて

2

あなたはあなたが必要

testApp:testApp():A(44100., "a", 200){ 
//testApp constructor. 
} 
+0

*初期化*、定義しない*ただし、これは正しい方法です。 –

+0

@Ben Voigtありがとう –

-1

Analyzer A; - >Analyzer *A;Analyzer A(44100., "a", 200); - >A = new Analyzer(44100., "a", 200);

0

などでTestAppのコンストラクタで のコンストラクタタイプを初期化することができますC++を一から学ぶ。あなたは、JavaやC#のような言語から参照セマンティクスを引き出そうとしており、それらはC++には存在しません。 C++のアプローチが必要です。

Analyzer A;は値です。それは直接構築されます。メンバ変数を使用する場合は、初期化子リストを使用してメンバ変数を作成する必要があります。機能ローカルスコープに、伝統的にあなたがオブジェクトのコピーを返すか、オブジェクトを保持するために、このようなshared_ptrとして自己所有のスマートポインタを使用

testApp::testApp() 
: A(args) {} 

。 C++では、実際に動的なライフタイムが必要な場合を除き、必要に応じてスタックベースの変数に別名を付けることができます。

+0

ありがとう、私は正確にそれをやっている途中です。 – buildsucceeded

関連する問題