2016-07-01 18 views
0

私はC++ドライバから、私が働く環境内のクラス内の新しいメソッドにいくつかの処理を移動しようとしています。私はこのメソッドの作業を開始しましたが、新しく記述されたメソッドのクラスに存在する他のオブジェクト依存メソッドを呼び出そうとすると、問題に直面しています。ここでは、コードの一部は次のとおりです。C++:別のメソッド内でオブジェクト依存メソッドを呼び出す

bool resample_edf(VVectorDouble& sigin_a, VVectorDouble& sig_out_a, 
        long out_freq_a) { 

    // display debugging information 
    // 
    if (debug_level_d >= Edf::LEVEL_DETAILED) { 
    fprintf(stdout, "Edf::resample_edf(): starting resample/n"); 
    } 

    // get the labels in the file 
    // 
    char* labels[Edf::MAX_NCHANS]; 

    long num_channels = Edf::get_labels(labels); 

    long num_samples = (long) Edf::get_duration() * Edf::get_sample_frequency(); 

... 

get_labels(labels)get_duration()、およびget_sample_frequency()方法は、私が働いていますEDFクラスのすべてのメソッドですが、それをコンパイルしようとしたとき、私はこのエラーを取得します。

edf_01.cc:2240:45: error: cannot call member function ‘long int Edf::get_labels(char**)’ without object 
    long num_channels = Edf::get_labels(labels); 
              ^
edf_01.cc:2242:47: error: cannot call member function ‘double Edf::get_duration()’ without object 
    long num_samples = (long) Edf::get_duration() * Edf::get_sample_frequency(); 

すべてのメソッドはパブリックメソッドですが、使用する変数の一部はクラスで保護されています。

この問題を解決する方法は正確にはわかりませんが、引き続き検討します。ありがとうございました。より多くの情報が必要な場合はお知らせください。

編集:私はいくつかの誤解があるので、より多くの情報を提供します。

このメソッドを呼び出すユーティリティにEdfオブジェクトが既に存在します。ユーティリティは、現時点では次のようになります。

// local include files 
// 
#include <Edf.h> 
... 
int main(int argc, const char** argv) { 
... 
    // create an Edf object 
    // 
    Edf edf(Edf::LEVEL_NONE); 

    // resample the signal 
    // 
    if (!edf.resample_edf(sig_in, sig_out, out_freq)) { 
    fprintf(stdout, " **> nedc_resample_edf: error resampling signal\n"); 
    return((status = -1)) 
    } 
... 

resample_edf方法は、EDFオブジェクト内のメソッドです。今、そのメソッドの中で、オブジェクトから他のメソッドを呼び出せるようにしたいのですが、そうすることでエラーが発生します。このメソッド内でedfオブジェクトを再インスタンス化しても、ここでは役に立ちません。私はそれをやるために複数の方法を試みましたが、何も働いていませんでした。

クラスのコンパイルにはユーティリティと関係がないため、ユーティリティの実行方法は当初含まれませんでした。この問題は、メソッドが同じオブジェクトから他のメソッドを呼び出す方法から発生します。 Edfクラスは非常に大きいので、すべてをあなたに提供することは難しいでしょう。

ご迷惑をおかけして申し訳ございません。

+1

/n代わりの\nを使用していることに気づきましたか?あるいは、静的関数を宣言しますか?いくつかの方法をリストしてください:) – Rakete1111

+2

[初心者の本を探す](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)とクラスとオブジェクトが相互に作用する方法を再学習するクラスとオブジェクトの違いは何か。 –

答えて

1

あなたはそれがEdfクラスに属する作るために以下のものを使用します(それがEDFクラスに属していません。)あなたがクラスに新しいメソッドにコードを移動したが、方法は自由であることを特徴とします。

bool Edf::resample_edf(VVectorDouble& sigin_a, VVectorDouble& sig_out_a, 
        long out_freq_a) 

そして、あなたはあなたの質問に示されているが、存在すると推定ないclass Edf {...}定義に、この関数のプロトタイプを追加してください。あなたの関数定義の内部からすべてEdf::年代を失う可能性が

class Edf 
{ 
//... 
bool resample_edf(VVectorDouble& sigin_a, VVectorDouble& sig_out_a, 
         long out_freq_a); 
//... 
}; 

よう

何か。

私はまた、あなたが `Edf`のインスタンスを作成し、あなたのfprintf

+0

これはまさに私が忘れたものです。時には、このような愚かな間違いを見つけるために、別の目のペアが必要になることもあります。ありがとうございました。 –

1

あなたはEdfクラス/構造体を表示していませんが、エラーメッセージはかなり明確です。

error: cannot call member function ... without object

Edfクラス/構造体でstatic関数を呼び出すときに、使用Edf::get_labels(labels);が正しいだろう。

ただし、非静的メンバー関数の場合は、クラス/ structのオブジェクトインスタンスが必要です。例えば

Edf edf; // Of course I don't actually know if this class is default constructible 
edf.get_labels(labels); 

上記のコード例のようなものは、コンパイルエラーを解決しますが、実際にあなたの問題を解決することはほとんどありません(つまり、デフォルト構築されたオブジェクトのインスタンスは、おそらくラベルにあなたを得ることができません検索しようとしています)。

おそらく、Edfクラスのインスタンスをパラメータとしてresample_edf関数に渡す必要がありますか?あなたのコメントから


resample_edfEdfのメンバ関数であるように聞こえます。

bool resample_edf(VVectorDouble& sigin_a, VVectorDouble& sig_out_a, 
        long out_freq_a) 
{ 
    // ... 

    // Just call your other member functions directly since `this` is an instance 
    // of the `Edf` object 
    get_labels(labels); 

    // ... 
} 
+0

オブジェクトにメソッドを渡すと同様に動作すると思っていましたが、メソッドがオブジェクトによって呼び出されているので、これを回避する方法があるかどうかはわかりませんでした。 –

+0

@JamesMchugh 'resf_edf'は' Edf'クラス/構造体の一部ですか?もしそうなら、それは重要です。投稿されると、 'resample_edf'は空き関数のように見えます。 –

+0

はい、問題は私がこの質問を投稿した時と同じ問題でした。私は 'bool Edf :: resample_edf(...) 'を入れるのを忘れていました。ありがとうございました。 –