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()
中,我将创建use
Passenger=newpassenger
要分配内存?请使用构造函数而不是
initSeat
。构造函数是一种没有返回类型且类名相同的方法,例如
public Seat(){}
?如果是指针,我会做
删除乘客然后<代码>乘客=空
第一条语句可以变成
delete*passenger