C++ 我应该采取什么步骤用普通变量替换指针的出现?
坐在下面的座位上:C++ 我应该采取什么步骤用普通变量替换指针的出现?,c++,pointers,reference,C++,Pointers,Reference,坐在下面的座位上: class Seat { Passenger* passenger; // I'd like this to be Passenger passenger; } 如果删除星号,应如何更新以下方法 bool initSeat() { passenger = NULL; // &passenger = NULL; does not compile as it's not a reference type. retur
class Seat
{
Passenger* passenger; // I'd like this to be Passenger passenger;
}
如果删除星号,应如何更新以下方法
bool initSeat()
{
passenger = NULL; // &passenger = NULL; does not compile as it's not a reference type.
return passenger == NULL; // Is there even a need to allocate memory? Maybe have the method blank?
}
及
我可能会感到困惑,因为我缺少一些基本概念。您应该阅读更多关于指针的内容,以帮助您理解内存分配和解引用。我强烈建议您在继续之前阅读一些坚实的C/C++初学者教程 基本上,如果你有一个指针,它只是一个内存地址。分配内存并将该地址分配给指针。然后适当地使用指针引用内存 如果要将成员从指针转换为正则变量,则不再需要分配任何内存。您还可以使用“.”和“->”字符访问其成员。但是请记住,当您传递这个变量时,它现在要大得多(它的所有成员的大小),这就是为什么传递指针更有效的原因 从您的评论来看,您似乎正在尝试使用引用。。。这是另一个话题。试试这个:
您真的应该阅读更多关于指针的内容,以帮助您理解内存分配和解引用。我强烈建议您在继续之前阅读一些坚实的C/C++初学者教程 基本上,如果你有一个指针,它只是一个内存地址。分配内存并将该地址分配给指针。然后适当地使用指针引用内存 如果要将成员从指针转换为正则变量,则不再需要分配任何内存。您还可以使用“.”和“->”字符访问其成员。但是请记住,当您传递这个变量时,它现在要大得多(它的所有成员的大小),这就是为什么传递指针更有效的原因 从您的评论来看,您似乎正在尝试使用引用。。。这是另一个话题。试试这个:
编辑版本。阅读我的评论:
class Seat
{
Passenger passenger;
}
InitSeat不是必需的,因为乘客将由乘客类的构造函数初始化
//bool initSeat()
//{
// passenger = NULL;
//return passenger == NULL;
//}
假设您将只获得作为参数的指针:
bool insertSeat(Passenger* p)
{
bool bsuccess = TRUE;
if (p != NULL)
{
passenger = *p; // dereference the pointer directly
}
else {
passenger = Passenger(); // Might not be needed, but if needed make sure the assignment operator is properly(operator=) implemented
}
return bsuccess;
}
基本上你需要复习一下指针和基本的类设计。编辑版。阅读我的评论:
class Seat
{
Passenger passenger;
}
InitSeat不是必需的,因为乘客将由乘客类的构造函数初始化
//bool initSeat()
//{
// passenger = NULL;
//return passenger == NULL;
//}
假设您将只获得作为参数的指针:
bool insertSeat(Passenger* p)
{
bool bsuccess = TRUE;
if (p != NULL)
{
passenger = *p; // dereference the pointer directly
}
else {
passenger = Passenger(); // Might not be needed, but if needed make sure the assignment operator is properly(operator=) implemented
}
return bsuccess;
}
基本上你需要复习一下指针和基本的类设计。没有空对象这样的东西。不过,有很多方法可以模仿这种行为。例如,您可以为
Passenger
重载bool
转换运算符,以实现所需的行为。比如说,
class Passenger
{
public:
operator bool() const{return not isNull;}
void nullify() {isNull = true;}
protected:
bool isNull;
};
initSeat
现在看起来像这样:
bool initSeat()
{
passenger.nullify();
return !passenger;
}
bool insertSeat(Passenger p)
{
bool bsuccess = TRUE;
if (p)
{
if (!passenger)
passenger = std::move(p);
else
bsuccess = FALSE;
}
else
passenger.nullify();
return bsuccess;
}
您还可以尝试使用
boost::optional
没有空对象这样的东西。不过,有很多方法可以模仿这种行为。例如,您可以为Passenger
重载bool
转换运算符,以实现所需的行为。比如说,
class Passenger
{
public:
operator bool() const{return not isNull;}
void nullify() {isNull = true;}
protected:
bool isNull;
};
initSeat
现在看起来像这样:
bool initSeat()
{
passenger.nullify();
return !passenger;
}
bool insertSeat(Passenger p)
{
bool bsuccess = TRUE;
if (p)
{
if (!passenger)
passenger = std::move(p);
else
bsuccess = FALSE;
}
else
passenger.nullify();
return bsuccess;
}
您还可以尝试使用
boost::optional
“步骤”?进行更改、尝试编译、修复错误、尝试编译、修复错误、尝试编译…如果删除*
,则需要将乘客重置为其初始状态,即调用其构造函数。它确实有一个构造函数,不是吗?否则,您可能需要不那么优雅的方式,比如额外的passengerhasbeensigned
标志。@meagar我不喜欢“在它看起来有效之前修补它”的方法。要回答这个问题,取决于Passenger
的外观。就目前情况而言,您有一个状态“不存在乘客”,该状态由空指针表示。如果将乘客更改为非指针,则不再具有该状态。(a)使程序不考虑空乘客不同于默认构造的乘客,或者(b)<代码>乘客<代码>本身必须能够表示“没有乘客”状态,或者(c)不使这改变你可能想要一个<代码>公共< /代码>类。这只是一个假设,但可能听起来像“步骤”?进行更改、尝试编译、修复错误、尝试编译、修复错误、尝试编译…如果删除*
,则需要将乘客重置为其初始状态,即调用其构造函数。它确实有一个构造函数,不是吗?否则,您可能需要不那么优雅的方式,比如额外的passengerhasbeensigned
标志。@meagar我不喜欢“在它看起来有效之前修补它”的方法。要回答这个问题,取决于Passenger
的外观。就目前情况而言,您有一个状态“不存在乘客”,该状态由空指针表示。如果将乘客更改为非指针,则不再具有该状态。(a)使程序不考虑空乘客不同于默认构造的乘客,或者(b)<代码>乘客<代码>本身必须能够表示“没有乘客”状态,或者(c)不使这改变你可能想要一个<代码>公共< /代码>类。这只是一个假设,但可能听起来不错。例如,在initSeat()
中,我将创建usePassenger=newpassenger
要分配内存?请使用构造函数而不是initSeat
。构造函数是一种没有返回类型且类名相同的方法,例如public Seat(){}
?如果是指针,我会做删除乘客代码>然后<代码>乘客=空
第一条语句可以变成delete*passenger但是第二个呢?我认为你不应该删除任何东西。你不需要删除