我是一个C++的新手,之前从事Java相关工作。我的类原型设置了两个私有指针对象成员。
class DriveController : Controller {
public:
DriveController(
int8_t portTL_, int8_t portTR_, int8_t portBL_, int8_t portBR_,
double wheelSize_, double baseSize_);
private:
// Internal chassis controller
okapi::ChassisControllerIntegrated *chassisController;
okapi::AsyncMotionProfileController *chassisMotionProfiler;
现在,在这个类的构造函数中,我使用API提供的工厂设计模式初始化这两个变量。这是唯一真正初始化这些类的方法。
DriveController::DriveController(
int8_t portTL_, int8_t portTR_, int8_t portBL_, int8_t portBR_,
double wheelSize, double baseSize)
{
// Initialize port definitions
portTL = portTL_;
portTR = portTR_;
portBL = portBL_;
portBR = portBR_;
// Create chassis
auto chassis = okapi::ChassisControllerFactory::create(
{portTL, portBL}, // Left motors
{portTR, portBR}, // Right motors
okapi::AbstractMotor::gearset::red, // torque gearset
{wheelSize, baseSize} // wheel radius, base width
);
chassisController = &chassis;
auto profiler = okapi::AsyncControllerFactory::motionProfile(
1.0, 2.0, 10.0, *chassisController);
chassisMotionProfiler = &profiler;
}
我知道我在这里分配内存时做错了什么,因为当我尝试访问稍后调用的函数中的这些成员指针时,程序会出现“内存权限错误”。我正在考虑使用unique_ptr来存储对象,因为它们管理生命周期很好,但由于创建对象的唯一方法是通过工厂初始化器,我还没有找到一个好的方法来构造unique_ptr。
那么,初始化这些指针成员的正确方法是什么?
chassis
和profiler
在范围结束时(构造函数)被销毁。当您尝试稍后访问它们的内存时,就没有对象了。至于初始化指针成员,除了您的Java背景外,是否有其他原因?如果没有,就不要使用指针,应该可以正常工作。 - me'unique_ptr
或类似的东西。然后,如果工厂返回了一个unique_ptr
,你可以将其存储在类中。但是,如果工厂无法修复,你可以简单地使用一个普通实例而不是对象,并使用工厂产品初始化它。是的,这意味着需要复制,因此是值得怀疑的,但是现在工厂本身就有问题,因为它返回副本。 - Ulrich Eckhardt