首页 > 解决方案 > 类定义应该放在全局范围内还是局部范围内?

问题描述

各位程序员。我已经看到将类定义放在源文件的全局范围内是一种常见的做法,在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++classooporganization

解决方案


如果您将 inside 的定义Dog放入main,则该定义的范围就像其他名称一样。

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

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使用它,而这里显示为私有)。


推荐阅读