Cannot allocate an object of type 'Command'

Guys,

I think I understand why this is throwing an error, but I am looking for the correct way to do this. In Brad Miller’s last Robot Builder video on youtube he writes the following java code:

autonomousCommand = (Command) autonomousModes->GetSelected();

Unfortunately, if you write the same code in C++ you get the following error:

C:/WindRiver/workspace/TestProject/Robot.cpp: In member function virtual void Robot::AutonomousInit()': C:/WindRiver/workspace/TestProject/Robot.cpp:40: error: cannot allocate an object of typeCommand’
C:/WindRiver/workspace/TestProject/Robot.cpp:40: error: because the following virtual functions are abstract:
C:/WindRiver/vxworks-6.3/target/h/WPILib/Commands/Command.h:79: error: virtual void Command::Initialize()
C:/WindRiver/vxworks-6.3/target/h/WPILib/Commands/Command.h:84: error: virtual void Command::Execute()
C:/WindRiver/vxworks-6.3/target/h/WPILib/Commands/Command.h:95: error: virtual bool Command::IsFinished()
C:/WindRiver/vxworks-6.3/target/h/WPILib/Commands/Command.h:101: error: virtual void Command::End()
C:/WindRiver/vxworks-6.3/target/h/WPILib/Commands/Command.h:114: error: virtual void Command::Interrupted()
C:\WindRiver\vxworks-6.3\host\x86-win32\bin\make.exe: *** [CommandBasedRobotTemplate/Debug/Objects/TestProject/Robot.o] Error 1

The idea is to cast to the “Command” type in order to be able to set autonomousCommand equal to the output of a SelectableChooser object (which is set by the user clicking on the desired command on the Smartdashboard) - which is then the command that gets run in autonomous.

Any thoughts? Thanks in advance.

  • Bryce

P.S. Here’s the complete code in Robot.cpp

void Robot::RobotInit() {
	RobotMap::init();
	// BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTRUCTORS
	driveTrain = new DriveTrain();
	elevator = new Elevator();
	wrist = new Wrist();
	claw = new Claw();
    // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTRUCTORS
	// This MUST be here. If the OI creates Commands (which it very likely
	// will), constructing it during the construction of CommandBase (from
	// which commands extend), subsystems are not guaranteed to be
	// yet. Thus, their requires() statements may grab null pointers. Bad
	// news. Don't move it.
	oi = new OI();
	lw = LiveWindow::GetInstance();
	// instantiate the command used for the autonomous period
	autonomousModes = new SendableChooser();
	autonomousModes->AddDefault("Deliver Cylinder", new DeliverCylinder());
	autonomousModes->AddObject("Awesome Autonomous", new AutonomousCommand());
	smartDashboard->PutData("Autonomous Modes", autonomousModes);
  }
	
void Robot::AutonomousInit() {
	autonomousCommand = (Command) autonomousModes->GetSelected();
	if (autonomousCommand != NULL) autonomousCommand->Start();
	
}

You can’t cast to Command class because it is an abstract class and therefore cannot have any instances. Try casting to CommandBase

There’s a new example of doing this in C++ at the bottom of this page:

http://wpilib.screenstepslive.com/s/3120/m/7932/l/81109-choosing-an-autonomous-program-from-smartdashboard

Brad

Thanks Brad. Just missing a *. I could have sworn that I tried that, but obviously not…

  • Bryce