gpt4 book ai didi

c++ - 命名空间和私有(private)静态类成员

转载 作者:搜寻专家 更新时间:2023-10-31 01:14:58 24 4
gpt4 key购买 nike

为什么这样做:

#include "iostream"

class Something {
private:
static int s_nIDGenerator;
int m_nID;
friend int main();
public:
Something() { m_nID = s_nIDGenerator++; }
int GetID() const { return m_nID; }
};

int Something::s_nIDGenerator;

int main() {
Something::s_nIDGenerator = 1;

Something cFirst;
Something cSecond;
Something cThird;

using namespace std;
cout << cFirst.GetID() << endl;
cout << cSecond.GetID() << endl;
cout << cThird.GetID() << endl;
return 0;
}

它打印:

1
2
3

这失败了:

#include "iostream"

namespace test {
class Something {
private:
static int s_nIDGenerator;
int m_nID;
friend int main();
public:
Something() { m_nID = s_nIDGenerator++; }
int GetID() const { return m_nID; }
};
};

int test::Something::s_nIDGenerator;

int main() {
using namespace test;
Something::s_nIDGenerator = 1;
// or test::Something::s_nIDGenerator = 1; same effect if not using using.

Something cFirst;
Something cSecond;
Something cThird;

using namespace std;
cout << cFirst.GetID() << endl;
cout << cSecond.GetID() << endl;
cout << cThird.GetID() << endl;
return 0;
}

编译错误信息为:

**** Internal Builder is used for build               ****
g++ -O0 -g3 -Wall -c -fmessage-length=0 -o src\tuttest1.o ..\src\tuttest1.cpp
..\src\tuttest1.cpp: In function 'int main()':
..\src\tuttest1.cpp:23:5: error: 'int test::Something::s_nIDGenerator' is private
..\src\tuttest1.cpp:27:13: error: within this context
Build error occurred, build is stopped
Time consumed: 161 ms.

如何使用命名空间测试让第二个示例正常工作?

对象周围的命名空间声明如何/为什么阻止访问静态成员表单?


根据我对@zmo 的评论,这是我根据他的线索所做的工作:

(评论没有空间或格式,我不得不编辑,因为我无法将其设置为答案....(无论需要什么。)

#include "iostream"

namespace test {
class Something {
private:
static int s_nIDGenerator;
int m_nID;
friend void load(int);
public:
Something() { m_nID = s_nIDGenerator++; }
int GetID() const { return m_nID; }
};

int Something::s_nIDGenerator;

void load (int value) {
Something::s_nIDGenerator = value;
}

};

int main() {
using namespace test;
load (1);

Something cFirst;
Something cSecond;
Something cThird;

using namespace std;
cout << cFirst.GetID() << endl;
cout << cSecond.GetID() << endl;
cout << cThird.GetID() << endl;
return 0;
}

对于“静态成员在类和命名空间中不起作用是怎么回事?”我还是有点不明白。这是怎么回事?为什么 test::Something::s_nIDGenerator 不起作用? (仍然是我原来问题的一部分。)所以,到目前为止,我们只回答了一半。

我想知道为什么这不起作用,所以我不会再走进这个耙子。

最佳答案

可能是因为您的 friend int main() 声明声明命名空间也有一个免费的 main() 函数,而真正的 main() 函数不在命名空间中。

修复它?首先在namespace test之前(和外部)声明int main();,然后声明friend int::main()以表明它在全局命名空间。

有关详细信息,请参阅 this question .

关于c++ - 命名空间和私有(private)静态类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10673997/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com