Log in

View Full Version : Cannot allocate an object of type 'Command'


Bryscus
09-01-2013, 13:11
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 type `Command'
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();

}

Bryce Paputa
09-01-2013, 15:00
You can't cast to Command class because it is an abstract class and therefore cannot have any instances. Try casting to CommandBase

BradAMiller
09-01-2013, 15:20
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

Bryscus
09-01-2013, 16:29
Thanks Brad. Just missing a *. I could have sworn that I tried that, but obviously not...

- Bryce