gpt4 book ai didi

C++私有(private)嵌套类——访问不同的函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:12:33 25 4
gpt4 key购买 nike

发现了这个奇怪的编译行为,检查了 VS2012、VS2017 和 https://www.onlinegdb.com/online_c++_compiler )

基本上对于私有(private)嵌套类,您可以在外部调用公共(public)函数,但不能调用公共(public)构造函数。

3个问题:

  • 编译器让我调用 func() 的原因是什么?

  • 如果编译器让我调用 func(),为什么我不能调用 ctor?

  • 如果我不能调用 ctor,为什么 emplace_back 可以调用?


class Outer {
struct PrivateInner {
PrivateInner() {}
void func() {}
};
public:
PrivateInner inner;
std::vector<PrivateInner> innerVect;
};

void f1()
{
Outer c;
c.inner.func(); // COMPILING, but why?
}

void f2()
{
Outer c;
c.innerVect.push_back(Outer::PrivateInner()); // NOT COMPILING, why no access to ctor if there is access to func()?
c.innerVect.emplace_back(); // COMPILING, but why? Doesn't it call Outer::PrivateInner inside?
}

如我所见,我仍然可以创建一个(静态)函数 createObject():

class Outer {
struct PrivateInner {
PrivateInner() {}
static PrivateInner createObject() { return PrivateInner(); }
void func() {}
};
.....
};

然后调用它。

如果从实例调用静态不是纯粹的标准事物,则 createObject() 可能是非静态的。

c.innerVect.push_back(c.inner.createObject()); // COMPILING

“破解”编译

最佳答案

请注意,嵌套的struct PrivateInner 被声明为private,因此只有Outer::PrivateInnerprivate,如果没有足够的访问权限,你不能使用这个名字来声明像 Outer::PrivateInner pi; 这样的变量,但是你可以像 decltype(Outer: :内部)圆周率;

另一方面,它的构造函数和成员函数是public,所以可以调用。

c.inner.func(); // COMPILING, but why?

func()public,所以如果你有一个 Outer::PrivateInner 类型的实例,你可以调用 func 就可以了。

c.innerVect.push_back(Outer::PrivateInner()); // NOT COMPILING, why no access to ctor if there is access to func()?

它与构造函数无关,你只是不能在这里使用名称Outer::PrivateInner

c.innerVect.emplace_back(); // COMPILING, but why? Doesn't it call Outer::PrivateInner inside?

构造函数是public,可以用来构造对象。 std::vector 不直接使用Outer::PrivateInner 之类的名称;它使用指定的名称作为模板参数。

顺便说一句:出于同样的原因,

c.innerVect.push_back(c.inner.createObject()); // COMPILING

但是 c.innerVect.push_back(Outer::PrivateInner::createObject()); 不会编译。

关于C++私有(private)嵌套类——访问不同的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48585843/

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