15

我不知道要搜索什么才能找到对此的解释,所以我在问。
我有这个报告错误的代码:

struct Settings{
    int width;
    int height;
} settings;

settings.width = 800; // 'settings' does not name a type error
settings.height = 600; // 'settings' does not name a type error

int main(){
    cout << settings.width << " " << settings.height << endl;

但是如果我将值赋值放在 main 中,它会起作用:

struct Settings{
    int width;
    int height;
} settings;

main () {
    settings.width = 800; // no error
    settings.height = 600; // no error

你能解释一下为什么吗?

编辑:
关于 Ralph Tandetzky 的回答,这是我的完整结构代码。你能告诉我如何像使用我的片段结构一样分配值吗?

struct Settings{
    struct Dimensions{
        int width;
        int height;
    } screen;

    struct Build_menu:Dimensions{
        int border_width;
    } build_menu;
} settings;
4

2 回答 2

27

您不能将赋值放在 C++ 中函数的上下文之外。如果您对有时看到=符号在函数上下文之外使用的事实感到困惑,例如:

int x = 42; // <== THIS IS NOT AN ASSIGNMENT!

int main()
{
    // ...
}

那是因为=符号也可以用于初始化。在您的示例中,您没有初始化数据成员widthheight而是为它们分配值。

于 2013-06-05T11:33:56.480 回答
9

在 C++11 中,您可以编写

struct Settings {
    int width;
    int height;
} settings = { 800, 600 };

为了修复你的错误。出现错误是因为您试图在函数体之外分配一个值。您可以在函数之外初始化但不能分配全局数据。

编辑:

关于您的编辑,只需写

Settings settings = {{800, 600}, {10, 20, 3}};

我不是 100% 确定,如果这可行,因为继承。我建议在这种情况下避免继承,并将Dimensionsas 成员数据写入您的Build_menu结构中。用这种方式继承,迟早会给你带来各种麻烦。更喜欢组合而不是继承。当你这样做时,它会看起来像

Settings settings = {{800, 600}, {{10, 20}, 3}};
于 2013-06-05T11:41:23.400 回答