Кодирование в заголовке и кодирование в cpp: другое поведение - PullRequest
1 голос
/ 16 марта 2012

Я обнаружил, что некоторый код не будет работать, если он не объявлен в самом заголовочном файле.Например, со следующим кодом «Hello World» будет напечатано при вызове test ():

//Myclass.h
class Myclass {
private:
    SoftwareSerial *ss;
public:
    void test() {
        ss = & SoftwareSerial(0,1);
        ss->begin(9600);
        ss->print("Hello World");;
    };
};

Но если я просто объявлю метод test () в заголовке и закодирую его в отдельномКак обычно, cpp с точно таким же кодом компилирует, но ничего не выводит:

//Myclass.cpp
void Myclass::test(){
    ss = & SoftwareSerial(0,1);
    ss->begin(9600);
    ss->print("Hello World");
 };
 //this won't output anything

Почему это так?

1 Ответ

7 голосов
/ 16 марта 2012

SoftwareSerial является типом. Вы берете указатель на временный объект, а затем разыменовываете его после того, как временный объект умер. Это незаконно ; Я не знаю, почему ваш компилятор принимает это, но я собираюсь выйти на конечность и предположить, что это не означает, что он делает то, что вы думаете. Вероятно, это что-то искажает и вызывает странное поведение, которое было бы глупостью пытаться объяснить.

Вместо того, чтобы:

//Myclass.h
class Myclass {
private:
    SoftwareSerial ss;
public:
    Myclass();
    void test();
};


//Myclass.cpp

Myclass::Myclass() : ss(0,1) {};

void Myclass::test() {
    ss.begin(9600);
    ss.print("Hello World");
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...