当函数重新调整通过引用传递时检查对象是否存在

check object existance when function retuning pass by reference

本文关键字:引用 检查 存在 是否 对象 新调整 函数 调整      更新时间:2023-10-16

我有非常基本的问题,并且有以下代码。在极少数情况下,我们无法调用 setDriver(set driver 对象)并调用 getDriver 函数来调用导致内存崩溃的驱动程序类函数(因为 setdriver 尚未设置)。是否可以检查获取驱动程序对象。我试图设置 NULL,但由于我们返回引用,因此不合适/不可行。

include<iostream>
#include<string>
using namespace std;
class Driver {
private:
 string name;
public:
  void setname(string name);
  void display();
};
void Driver::setname(string name)
{
  this->name = name;
}
void Driver::display()
{
  cout<<" This driver is .."<<name<<endl;
}
class sample {
protected:
Driver *m_d;
public:
void setDriver(Driver *driver);
Driver& getDriver();
};
void sample::setDriver(Driver *driver)
{
   m_d = driver;
}
Driver& sample::getDriver()
{
   return *m_d;
}
int main()
{
  sample s;
  Driver *d = new Driver;
  d->setname("test");
  s.setDriver(d);
  Driver &d1 = s.getDriver();
  // How can I check if d1 is exist or not 
  d1.display();
}

从下面的讨论中获得输入后,我将代码修改为以下方式。 它会是正确的解决方案吗?

#include<iostream>
#include<string>
using namespace std;
class Driver {
private:
 string name;
public:
  void setname(string name);
  void display();
};
void Driver::setname(string name)
{
  this->name = name;
}
void Driver::display()
{
  cout<<" This driver is .."<<name<<endl;
}
class sample {
protected:
Driver *m_d;
public:
void setDriver(Driver *driver);
Driver& getDriver();
sample();
};
sample::sample()
{
  m_d = NULL;
}
void sample::setDriver(Driver *driver)
{
   m_d = driver;
}
Driver& sample::getDriver()
{
   if(m_d)
     return *m_d;
   else
         throw "Error";
}
int main()
{
  sample s;
  Driver *d = new Driver;
  d->setname("test");
  s.setDriver(d);
  try{
      Driver &d1 = s.getDriver();
      d1.display();
  }
  catch(...)
  {
    cout<<" object is not prsent"<<endl;
  }

引用不能指向任何内容,所以我建议两个选项:a) 抛出一个例外 - 这对我来说显然是最好的解决方案;这是一个边缘情况,非常适合异常处理b) 包括一个方法driver.isLoaded(),调用者可以检查该方法 - 在无法分配驱动程序的情况下返回一个存根驱动程序,该驱动程序将此值返回为 false

或者,需要更改调用的性质以返回指针(以便可以返回 null),或者将驱动程序作为引用参数传递并返回布尔值以指示成功。对我来说,这些选项似乎都不如上述选项好。

不必检查指针是否为 null 的一种安全方法是强制它从不为:

class sample {
public:
    // No default constructor
    explicit sample(Driver &driver) m_d(&driver) {}
    void setDriver(Driver &driver) { m_d = &driver; }
    Driver& getDriver() { return *m_d; }
private:
    Driver *m_d;
};

用法:

int main()
{
    Driver d1;
    d1.setname("test1");
    Driver d2;
    d2.setName("test2");
    sample s(d1);
    s.getDriver().display();
    s.setDriver(d2);
    s.getDriver().display();
}