2012-02-12 2 views
1

Я работаю над некоторым кодом OpenCV и разработал его в VS 2008 на окнах. Я пытаюсь запустить код в Linux с g ++, но я получаю сообщение об ошибке «Не могу напрямую вызвать конструктор 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

. Вы должны сообщить нам, где происходит ошибка, и, как говорит Эд, что такое ImageProcessor? Первая строка в цикле while выглядит странно. – John3136

+3

C++ работает иначе. Начните с хорошей книги. –

ответ

6

Этот код ужасный.

Почему вы квалифицируете каждую функцию-член?

И нет, вы не можете вызвать конструктор на уже созданном объекте. Любые параметры конструктора должны быть предоставлены при инициализации объекта (который ваш код делает с new, что также не является хорошим стилем C++). Если эти аргументы не должны предоставляться до тех пор, пока они не будут построены, измените «конструктор» на нормальную функцию-член с соответствующим именем.

В вашем коде также есть многочисленные утечки памяти. Похоже, вы пишете Java-код с синтаксисом C++. Это нехорошо.

+1

-1 «Вы не можете вызвать конструктор на уже созданном объекте». неверно, и ответ не помогает конструктивно помогать OP. Как бы я ни был согласен с другими высказанными здесь чувствами, мне приходится спускаться вниз. Сожалею. –

+3

Почему бы не переместить этот ответ в раздел ** комментарий ** - это ведь просто комментарий? –

+0

@Alf: Мой ответ правильный. Вы можете создать новый объект, повторно использующий одну и ту же память, но это новый объект. И «изменение конструктора в нормальную функцию-член» является решением проблемы. –

2

Этот код довольно странный, восстанавливая IP каждый раз через цикл, поверх существующего объекта?

Не уверен, что синтаксис

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

всегда был действительным. Может быть, в очень старом C++. Обычный способ сделать это

new (IP) ImageProcessor(img0, r); 

Не сказать, что это хорошая идея, но я думаю, что он будет делать то же самое.

+0

Этот код не восстанавливает ничего. В C++ это незаконно. Ваш код просто работает над проблемой, которая не существует в первую очередь. – pmr

+4

Пожалуйста, не предлагайте размещение 'new'. Я думаю, что подходящей вещью будет локальная переменная без указателя, заключенная внутри цикла. –

+1

Ну, я бы не сказал, что я был _suggesting_, просто, если VS принимает конструктор 'IP->', я предполагаю, что это то, что он делает. Но я никогда не защищу все это; это очень странно, и я не могу оправдать, почему кто-то написал бы что-нибудь подобное. Но тогда у меня нет фона в VS, и я вижу VS-фрагменты все время, которые выглядят странно (хотя и не совсем странно). – smparkes

Смежные вопросы