【问题标题】:Should a class definition be put in the global or local scope?类定义应该放在全局范围内还是局部范围内?
【发布时间】:2019-01-25 00:45:18
【问题描述】:

各位程序员。我已经看到将类定义放在源文件中的全局范围内,main() 函数上方的常见做法我现在不担心类定义的细节。

class Dog { ... };

int main() {
    Dog dog1;
    ...
    return 0;
}

我们为什么要这样做?这是一个规则还是只是一个共同的约定?我们也可以将类定义放在main() 函数中吗?这样做有什么优点/缺点?

考虑以下两行代码:

class Dog { ... } dog1;
int dog1;

在我看来,class Dog { ... } 就像 int 一样只是一种数据类型。

如果我只在main() 函数中使用某个类的对象,为什么不把类定义也放在main() 函数中呢?这是不好的编程习惯吗?或者这是只有 C 程序员对结构做的事情?将类定义放在全局范围内的原因是什么?

int main() {
    class Dog { ... };

    Dog d1;
    ...
    return 0;
 }

【问题讨论】:

  • 本地类有时很有用。但通常希望将可分离的事物分开。正如凯撒曾经指出的那样,分而治之。

标签: c++ class oop organization


【解决方案1】:

本地类很少有用。举个例子:你可以用Dog 对象做什么?您不能将其传递给任何其他函数。没有其他代码可以用它做任何事情。将其数据封装在一个范围如此有限的对象中有何意义?

一个类的所有机器都会在使用如此有限的情况下受益吗?构造函数、析构函数、成员函数、运算符重载等。不是很有用。你会有private 变量吗?可能不是。重点是什么;没有人可以隐藏它们。

有时创建本地struct 非常有用,尤其是plain old data (POD) 结构。只有公共变量且没有成员函数的 POD 可用于快速分组几个相关值。即使这样,这种用法也很少见。

【讨论】:

    【解决方案2】:

    如果将Dog 的定义放在main 中,则该定义的范围与其他名称一样。

    这意味着main 之外的函数看不到Dog 的定义,因此您无法定义(例如)将Dog 作为参数的函数。所以,这行得通:

    class Dog {};
    
    void foo(Dog const &d); // no problem
    
    int main() { 
        Dog d;
        foo(d);
    }
    

    ...但这不是:

    void foo(Dog const &d);
    
    int main() { 
        class Dog {} d;
        foo(d);
    }
    

    ...添加Dog 的前向声明也不起作用。

    大多数类型基本上对所有代码都是可见的,因此它们通常定义在任何函数之外。

    一些类型仅供其他特定类型使用,在这种情况下,它们通常在该类型中定义:

    class linked_list {
        class node {};
    };
    

    现在有一个名为linked_list::node 的类型,但您需要linked_list 限定符才能找到node(当然,node 必须公开linked_list 之外的任何内容才能使用它,而这里它显示为私有)。

    【讨论】:

    • 那个链表例子很好!为什么要开设本地课程真的很有意义。
    • 你是对的,函数不知道第二个例子中的Dog是什么。
    猜你喜欢
    • 2021-04-30
    • 2017-03-05
    • 2016-11-13
    • 2016-05-08
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多