2010-04-05 2 views
2

Итак, я определил класс какGDB пропускает мой код!

DataLoggingSystemStateReceiver 
{ 
DataLoggingSystemStateReceiver() 
: // initializer list 
{ 
    // stuff 
} 

// ... other functions here 

}; 

В основном, я создаю экземпляр DataLoggingSystemStateReceiver так:

int main() 
{ 
    // ... run stuff 
    Sensor sensor(port, timer); 

    DataLoggingSystemStateReceiver dlss(); 

    Log::notice("started"); 
    return 0; 
} 

Однако, когда я пошагово этот код в GDB, он работает:

Sensor sensor(port, timer); 

скачет

DataLoggingSystemStateReceiver dlss(); 

и продолжает

Log::notice("started"); 

Что это дает?


РЕДАКТИРОВАТЬ: Изменяя

DataLoggingSystemStateReceiver dlss(); 

к

DataLoggingSystemStateReceiver dlss; 

в главной(), линия выполняет. Может кто-нибудь объяснить, почему?

+2

просто для того, чтобы убедиться: вы используете '-g' для компиляции кода? –

+0

Да, я использую -g. –

ответ

9

Это:

DataLoggingSystemStateReceiver dlss(); 

не объявляет автоматической переменной. Он объявляет функцию с именем dlss, которая не принимает аргументов и возвращает DataLoggingSystemStateReceiver.

Вы хотите:

DataLoggingSystemStateReceiver dlss; 

Объект будет дефолт инициализируется, поэтому для вашего типа класса, конструктор по умолчанию будет называться.

+0

Происходит ли такое поведение, потому что конструктор по умолчанию объекта не принимает аргументов? –

+7

@sheep: Нет. Это просто недостаток синтаксиса, он называется «самым неприятным анализом». Компилятор просто читает это как объявление функции, это не имеет никакого отношения к вашему классу. – GManNickG

+0

Прохладный. Спасибо за объяснение! –

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