您好我是c ++的新手,
我可以使用Example example("123")
我有两个问题
我知道我们无法检查对象是否为空if(example ==NULL)
,因为这不是指针,我们还有其他方法可以做到这一点。
我有一个返回对象的方法:如何返回null?
Example get_Example() {
if (example.getName().empty() {
Example example("345");
return example;
}
return NULL // i cannot return null.
}
我可以这样做吗?
Example get_Example() {
Example example;
if (example.getName().empty() {
example = Example example("345");
return example;
}
return NULL // i cannot return null. How
}
example = Example example("345");
我知道这很愚蠢但是如果没有指针我该怎么做呢。
答案 0 :(得分:2)
使用指针Example *ex = NULL
。
构建默认null_example
并重载==
Example e;
if (e == null_example) {
e.init();
}
但您可以提供is_init()
功能。
Example e;
if (!e.is_init()) {
e.init();
}
你get_example
可能是这样的:
void get_example(Example &e) {
// method2 or method3
}
答案 1 :(得分:1)
不要将C ++对象视为OOP或Java。示例不是参考。它是对象本身。它之所以存在,是因为它已经被贴上了。
如果您可以为您定义为null的对象定义“状态”,则检查null(或使其为null)是有意义的。
例如你可以定义一个
explicit operator bool() const
方法,当对象成员具有您定义的表示“非空示例”的值时返回true。
检查空Example actualexample
,此时只是if(!actualexample)
答案 2 :(得分:1)
另一种选择是使用Null Object Pattern。 Null对象模式基本上允许yo返回一个您标识为null的完全构造的对象。
维基百科文章链接中的示例提供了一个很好的示例:
class animal
{
public:
virtual void make_sound() = 0;
};
class dog : public animal
{
void make_sound() { cout << "woof!" << endl; }
};
class null_animal : public animal
{
void make_sound() { }
};
记住做一些事情,比如创建一个特定的“空对象”(即在某处定义全局Example kNullExample;
)并不是一个好的解决方案,因为如果你将它分配给另一个Example对象(即Example newObject = kNullExample;
)你将无法识别对象不再为空的事实。
另一种选择是在对象的某处存储一个布尔值并编写一个“IsNull()”函数。这只是一个真正的解决方案,当你无法让你的类变为虚拟(例如映射二进制文件)或者你真的无法负担虚拟表跳转。
答案 3 :(得分:0)
您不能以这种方式分配NULL指针,因为返回对象不是指针。如果您不想使用指针,则posible选项可能是使用特定的NULL Example对象。我的意思是,如果对象实例是您认为的NULL,则使用此类的自定义属性进行检查。可能是你可以使用构造函数中传递的空字符串:
exampleNull = Example example("");
并检查字符串属性以验证“null”对象
但请记住:NULL只能分配给指针类型
答案 4 :(得分:0)
不是创建一个返回值的方法,而是简单地重写运算符==
,并在那里进行控制,所以如果你执行if(example ==NULL)
,控件的重载方法将返回所需的布尔值。