我有非常基本的问题,并有以下代码。在很少的情况下,我们不能调用setDriver(set驱动程序对象)和调用getDriver函数来调用驱动程序类函数,从而导致内存崩溃(因为set驱动程序没有设置)。是否可以检查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;
}发布于 2014-12-31 08:04:04
引用不能指向任何东西,所以我建议两个选项:( a)抛出一个异常--对我来说这显然是最好的解决方案;这是一个边缘情况,非常适合异常处理( b)包括一个方法driver.isLoaded(),调用方可以签入该方法--在不能分配驱动程序时,返回一个存根驱动程序,该存根驱动程序将此值返回为false。
或者,您需要更改调用的性质,以返回指针(以便返回null)或将驱动程序作为引用参数传递,并返回布尔值以表示成功。在我看来,这两种选择都不如上面的好。
发布于 2014-12-31 09:09:32
不需要检查指针是否为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();
}https://stackoverflow.com/questions/27718032
复制相似问题