程序结束后重新初始化C ++对象

时间:2015-01-03 01:55:12

标签: c++ object

快速C ++问题:我正在做一些Raspberry Pi / Arduino的东西,所有内容都已设置好,所以我正在为控制Arduino的Raspberry Pi编写代码。 那里是代码的图片,然后是输出的图片。如果你在代码中看到:最后一行是" cout<< "结束测试" << endl;",但是在输出中,在该语句之后还有别的东西,并且是在初始化霸天虎时得到的输出(正如您在输出的开头看到的那样)。知道为什么会这样吗?

以下是程序代码:

int main() {
  Decepticon d;
  cout << "Hello, World!"<< endl;
  //traverse(d);                                                                                    
  d.forward();
  //cout << "Start Test" << endl;                                                                   
  // cout << d->get_arduino_message() << endl;                                                      
  cout << "End Test" << endl;

  return 0;
}

这是目标代码:

#include <stdio.h>
#include "decepticon.hpp"
#include <cstring>
#include <iostream>
//using namespace cv;                                                                               

/** Constructor                                                                                     
 */
Decepticon::Decepticon() {
    this->left_speed = 0;
    this->right_speed = 0;
    this->claw_pos = 0;
    //this->camera = raspiCamCvCreateCameraCapture(CAMERA_DEV);                                     
    serial_connect(&this->commlink, NULL, BAUDRATE, 0);
    if (this->commlink.connected){
      std::cout << "Connected!" << std::endl;
      send_to_arduino();
    }
}

/** Deconstructor                                                                                   
 */
Decepticon::~Decepticon() {
  if (this->commlink.connected) {
    stop();
    serial_disconnect(&this->commlink);
  }
  // if (this->camera)                                                                              
  //raspiCamCvReleaseCapture(&this->camera);                                                        
}

/** Set the left-hand side speed                                                                    
 *  @param speed                                                                                    
 *    a value from -255 (full backward) to 255 (full forward)                                       
 */
void Decepticon::set_left(int speed) {
  this->left_speed = limit_signal(speed, -255, 255);
  send_to_arduino();
}

/** Set the right-hand side speed                                                                   
 *  @param speed                                                                                    
 *    a value from -255 (full backward) to 255 (full forward)                                       
 */
/** Make robot go full speed forward                                                                
 */
void Decepticon::forward() {
  this->left_speed = 255;
  std::cout << "left speed: " << this->left_speed << std::endl;
  this->right_speed = 255;
  send_to_arduino();
}

char *Decepticon::get_arduino_message() {
  char *message;
  message = serial_read(&this->commlink);
  if (strlen(message) == 0){
    std::cout << "message is NULL" << std::endl;
    return NULL;
  }
  return message;
}


void Decepticon::send_to_arduino() {
  int l, r, c;
  std::cout << "Start" << std::endl;
  l = this->left_speed < 0 ? -this->left_speed + 255 : this->left_speed;
  std::cout << "l = " << l << std::endl;
  r = this->right_speed < 0 ? -this->right_speed + 255 : this->right_speed;
  c = this->claw_pos;
  sprintf(this->buf, "%03d%03d%03d\n", c, l, r);
  std::cout << this->buf << std::endl;
  serial_write(&this->commlink, this->buf);
  std::cout << "End" << std::endl;
}
/** Make the robot stop in place                                                                    
 */
void Decepticon::stop() {
  this->left_speed = 0;
  this->right_speed = 0;
  send_to_arduino();
}

这是输出:

Connected!
Start
l = 0
000000000

000000000
Write Succeeded
End
Hello, World!
left speed: 255
Start
l = 255
000255255

000255255
Write Succeeded
End
End Test
Start
l = 0
000000000

000000000
Write Succeeded
End

4 个答案:

答案 0 :(得分:0)

你问:

  

最后一行是&#34; cout&lt;&lt; &#34;结束测试&#34; &LT;&LT; endl;&#34;,但是在输出中,在该语句之后还有其他东西,并且当Decepticon被初始化时会得到的输出(正如您在输出的开头看到的那样)。知道为什么会这样吗?

Decepticon的析构函数在从函数返回之前以及在执行函数中的最后一行代码之后被调用d。如果Decepticon的析构函数打印出任何消息,它们将在函数的最后一行输出后打印出来。

答案 1 :(得分:0)

Decepticon析构函数正在调用stop(),后者又调用send_to_arduino()功能是输出main()完成后您看到的消息的功能。

如果您不希望发生这种情况,您可能最好修改析构函数,以便它不会调用该特定的函数链。

或者,如果您需要完成实际工作但没有生成输出,您可以只使用一个名为echo的成员变量,该变量在构造函数中初始化为true,并在析构函数的开头设置为false。然后将send_to_arduino()修改为:

void Decepticon::send_to_arduino() {
  int l, r, c;
  if (echo) std::cout << "Start" << std::endl;
  l = this->left_speed < 0 ? -this->left_speed + 255 : this->left_speed;
  if (echo) std::cout << "l = " << l << std::endl;
  r = this->right_speed < 0 ? -this->right_speed + 255 : this->right_speed;
  c = this->claw_pos;
  sprintf(this->buf, "%03d%03d%03d\n", c, l, r);
  if (echo) std::cout << this->buf << std::endl;
  serial_write(&this->commlink, this->buf);
  if (echo) std::cout << "End" << std::endl;
}

毫无疑问,根据您的需要,其他方法可以做到这一点。

答案 2 :(得分:0)

我几乎肯定Decepticon类有一个析构函数打印出来的东西。一旦d超出范围,就会打印出一些内容,但是无法确定是否正是d正在打印的内容。例如,全局变量可能是一个例外。

编辑:

我现在知道它要么是

stop();

serial_disconnect(&this->commlink);

负责打印某些内容,并确认它确实是析构函数。

编辑:如果你想停止向arduino发送额外的消息,请尝试在析构函数的停止调用中注释掉发送调用。

答案 3 :(得分:0)

遵循析构函数的逻辑

调用stop调用send_to_arduino等。这是额外的输出。

您可以通过调试器

执行此操作