当函数重新调整通过引用传递时检查对象是否存在
check object existance when function retuning pass by reference
我有非常基本的问题,并且有以下代码。在极少数情况下,我们无法调用 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();
}
相关文章:
- C/C++ 取消引用错误:在空检查之前取消引用
- 使用 python 绑定来检查 C++ 类型是否是规范方式的指针、引用等?
- 特征:返回对具有编译时间尺寸检查的矩阵块的引用
- 如何检查给定类型的变量是否可以取消引用
- 如何检查一个名称是否与另一个名称引用相同的符号
- std::is_pointer检查通用引用
- 我可以根据null或特定类型的值检查引用吗
- 检查指针是否为null,然后在同一if语句中取消引用它,这样安全吗
- C ++安全地通过引用传递,并编译时检查大小
- cppcheck null指针取消引用:m_buffer-否则,针对null进行检查是多余的
- 类型特征:检查引用成员变量是否是静态的
- 检查实例是否存在,并在Singleton getInstance();中返回引用;
- 可以检查空取消引用的调试软件
- 当函数重新调整通过引用传递时检查对象是否存在
- 重载相等运算符==时,应先检查引用相等性
- 智能指针:通过引用设置、重置、设置null、null检查或重置检查
- C++:检查地址是否被引用
- 如何在取消引用之前检查迭代器(C++)
- 通过引用或指针返回并检查是否为空
- C++智能指针取消引用 - 检查它是否已初始化的开销是多少?