我有非常基本的问题并且有以下代码。在极少数情况下,我们无法调用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;
}
答案 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();
}