首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >引用函数重调传递时检查对象的存在性

引用函数重调传递时检查对象的存在性
EN

Stack Overflow用户
提问于 2014-12-31 07:57:43
回答 2查看 58关注 0票数 1

我有非常基本的问题,并有以下代码。在很少的情况下,我们不能调用setDriver(set驱动程序对象)和调用getDriver函数来调用驱动程序类函数,从而导致内存崩溃(因为set驱动程序没有设置)。是否可以检查getdriver对象。我尝试过设置NULL,但是由于我们正在返回引用,这是不合适的/不可行的。

代码语言:javascript
复制
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();
}

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

代码语言:javascript
复制
#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;
  }
EN

回答 2

Stack Overflow用户

发布于 2014-12-31 08:04:04

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

或者,您需要更改调用的性质,以返回指针(以便返回null)或将驱动程序作为引用参数传递,并返回布尔值以表示成功。在我看来,这两种选择都不如上面的好。

票数 2
EN

Stack Overflow用户

发布于 2014-12-31 09:09:32

不需要检查指针是否为null的一种安全方法是强迫指针永远不为:

代码语言:javascript
复制
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;
};

用法:

代码语言:javascript
复制
int main()
{
    Driver d1;
    d1.setname("test1");
    Driver d2;
    d2.setName("test2");

    sample s(d1);
    s.getDriver().display();
    s.setDriver(d2);
    s.getDriver().display();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27718032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档