2012-02-12 20 views
1

私はいくつかのOpenCVコードで作業しており、WindowsのVS 2008でそれを開発しました。私はg ++でLinux上でコードを実行しようとしていますが、ImageProcessorと作成した他のすべてのクラスに対して、「ImageProcessor :: ImageProcessorを直接呼び出すことはできません。私は間接的にコンストラクタを呼び出す方法を見つけるしようとしたが、役に立たない。どんな提案も素晴らしいだろう。コードはコンパイルされ、Windows上で正常に動作します。C++コンストラクタを直接呼び出すことができません。

if (x == 1){ 
    cout <<"MODE SELECTED: IMAGE TESTING \n"; 
    ImageProcessor* IP = new ImageProcessor; 
    LaneDetector* LD = new LaneDetector; 
    LaneInfo* LI1 = new LaneInfo; 
    LaneInfo* LI2 = new LaneInfo; 
    LaneVector* LV = new LaneVector; 
    cvNamedWindow("Window",CV_WINDOW_AUTOSIZE); 

    IplImage* temp = 0; 
    IplImage* img0 = 0; 
    img0 = cvLoadImage(PICTURE_INPUT); 
    CvRect r = cvRect(0,((img0->height)/3),img0->width,((img0->height)/3)+20); 
    cout <<"IMG0 LOADED \n"; 

    while(1){ 
     IP->ImageProcessor::ImageProcessor(img0, r); 
     temp = IP->ImageProcessor::get_processed_image(); 
     LD->LaneDetector::LaneDetector(temp,r); 
     LD->LaneDetector::find_edges(); 
     LI1 = LD->LaneDetector::find_lanes(5); 
     LI2 = LD->LaneDetector::find_lanes(25); 
     LV->LaneVector::LaneVector(LI1,LI2); 
     LV->LaneVector::print_lane_angle_info(); 

     if((cvWaitKey(20) & 255) == 27) break; 
     cvShowImage("Window", temp); 
     hold(1); 
    } 
} 
+0

'ImageProcessor'の宣言を提供してください –

+0

エラーがどこで発生するかを教えてください.Edが言うように、ImageProcessorの外観はどうですか? whileループの最初の行は私にとって奇妙に見えます。 – John3136

+3

C++の動作はそれとは異なります。良い本から始める。 –

答えて

6

このコードはひどいです。

なぜすべてのメンバー機能を適格にしていますか?

いいえ、既に作成されたオブジェクトでコンストラクタを呼び出すことはできません。オブジェクトを初期化するとき(コードではnewで行いますが、これも良いC++コーディングスタイルではありません)、任意のコンストラクタパラメータを指定する必要があります。これらの引数が構築後間もなく提供されるはずでない場合は、適切な名前を持つ通常のメンバ関数に「コンストラクタ」を変更します。

コードにも多数のメモリリークがあります。 C++構文のJavaコードを作成しているようです。それは良いことではありません。

+1

-1 "すでに作成されたオブジェクトでコンストラクタを呼び出すことはできません。間違っている、と答えは建設的にOPの修正物事を支援していません。しかし、私はここに表現された他の感情に同意するが、私はdownvoteする必要があります。ごめんなさい。 –

+3

この答えを**コメント**セクションに移動してみませんか? –

+0

@Alf:私の答えは正しいです。同じメモリを再利用する新しいオブジェクトを作成することはできますが、それは新しいオブジェクトです。そして、 "コンストラクタを通常のメンバ関数に変更する"は、この問題に対する解決策です。 –

2

このコードは、ループの都度、既存のオブジェクトの上にIPを再構築するのはかなり奇妙ですか?構文

わからない

IP->ImageProcessor::ImageProcessor(img0, r); 

は今まで有効でした。おそらく、非常に古いC++であろう。これを行うための通常の方法は、それは良いアイデアだとは言わない

new (IP) ImageProcessor(img0, r); 

ですが、私はそれは同じことをやると思います。

+0

そのコードは何も再構築していません。 C++では違法ではありません。あなたのコードは、最初に存在しない問題を回避するだけです。 – pmr

+4

「新しい」配置を提案しないでください。適切なことは、ループ内でスコープされたローカルのポインタ以外の変数だと私は思う。 –

+1

さて、もしVSが 'IP-> 'コンストラクタを受け入れるならば、私はそれが何をしているのか推測しています。しかし、私は全部を守るつもりはない。それは非常に奇妙で、私は本当に誰もがこのようなことを書く理由を正当化することはできません。しかし、その後、私はVSの背景を持っていないと私は奇妙に見えるVSスニペットが表示されます(これはかなり奇妙ではありません)。 – smparkes