函数返回通过引用传递时检查对象是否存在

时间:2014-12-31 07:57:44

标签: c++

我有非常基本的问题并且有以下代码。在极少数情况下,我们无法调用setDriver(设置驱动程序对象)并调用getDriver函数来调用驱动程序类函数,从而导致内存崩溃(因为setdriver尚未设置)。是否可以检查getdriver对象。我试图设置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;
  }

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

不必检查指针是否为空的安全方法是强制它永远不会:

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();
}