2

您好,我是 C++ 新手,

我可以使用创建一个类的新实例Example example("123")

我有两个问题

  1. 我知道我们无法检查对象是否为空,if(example ==NULL)因为这不是指针,我们还有其他方法可以做到这一点。

  2. 我有一种返回对象的方法,例如:如何返回 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");我知道这很愚蠢但是没有指针我怎么能做到这一点。

4

5 回答 5

2
  1. 使用指针,Example *ex = NULL.

  2. 构造一个默认值null_example并重载==

    Example e;
    if (e == null_example) {
        e.init();
    }
    
  3. 但你可以只提供一个is_init()功能。

    Example e;
    if (!e.is_init()) {
         e.init();
    }
    
  4. get_example可能是这样的:

    void get_example(Example &e) {
         // method2 or method3
    }
    
于 2013-05-04T14:23:54.737 回答
1

不要将 C++ 对象视为 OOP 或 Java。示例不是参考。它是对象本身。它之所以存在,是因为它已被贴花。

如果您可以为您定义为 null 的对象定义“状态”,则检查 null(或使其为 null)是有意义的。

例如,您可以定义一个

explicit operator bool() const方法并在对象成员具有您定义的表示“非空示例”的值时返回 true。

检查 null Example actualexample,此时只是if(!actualexample)

于 2013-05-04T14:25:32.607 回答
1

另一种选择是使用Null Object Pattern。空对象模式基本上允许你返回一个完全构造的对象,你标识为空。

链接的维基百科文章中的示例给出了一个很好的例子:

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 newObject = kNullExample;),您将无法识别该对象不存在的事实更长的空。

另一种选择是在对象的某处存储一个布尔值并编写一个“IsNull()”函数。只有当你不能让你的类变成虚拟的(例如映射二进制文件)或者你真的负担不起虚拟表跳转时,这才是真正的解决方案。

于 2013-05-04T14:30:56.957 回答
0

您不能以这种方式分配 NULL 指针,因为返回对象不是指针。如果您不想使用指针,一个可能的选项可能是使用特定的 NULL Example 对象。我的意思是检查该类的自定义属性是否对象实例是您认为为 NULL 的对象。也许您可以使用构造函数中传递的空字符串:

exampleNull = Example example(""); 

并检查字符串属性以验证您的“空”对象

但请记住:NULL 只能分配给指针类型

于 2013-05-04T14:20:56.517 回答
0

与其创建一个返回值的方法,不如简单地重写 operator ==,并在那里创建一个控件,因此如果您执行if(example ==NULL)该控件的重载方法将返回所需的布尔值。

于 2013-05-04T14:26:47.643 回答