c++ - 私有嵌套类访问外部类的私有函数
问题描述
我的代码的简化版本
class Outer
{
private:
double Foo(double a=0; double b=1);
class Inner
{
public:
Inner()
{
mX = Foo(2, 3);
}
private:
double mX;
};
};
我的问题是,Inner 无法访问 Foo 函数。我环顾了各个网站,了解需要做什么。我在一页上看到使用friend关键字可能很有用,但我似乎无法正确应用它。
由于我的其余代码的结构方式,我想将 Inner 类保留在 Outer 中。
我不认为这是另一个问题的副本,但如果我错了,我深表歉意。
感谢您的任何建议!
解决方案
一些错误:
double Foo(double a=0; double b=1);
;
不是函数参数之间的分隔符,,
而是使用。
mX = Foo(2, 3);
Foo
是非静态函数,这意味着它与对象接口相关。如果不指定它与哪个对象相关,则不能调用它。
要修复它,您可以创建一个对象并调用相关对象的此函数,或者将此函数设为静态函数。
创建对象的示例:
class Inner {
public:
Inner() {
Outer o; // Consider making it a class member object, so in each call / use it will relate to the same one. Be aware that in this case you will need to use a pointer to the outer class, due to 'incomplete type' error.
mX = o.Foo(2, 3);
}
private:
double mX;
};
使其成为静态函数的示例:
class Outer {
private:
static double Foo(double a=0, double b=1);
class Inner {
public:
Inner() {
mX = Outer::Foo(2, 3);
}
private:
double mX;
};
};
在静态函数的情况下,还请考虑以下赋予 mX 其值的方法Foo
:
class Inner {
public:
Inner() {}
private:
double mX = Outer::Foo(2, 3); // Recommended by Cpp guidelines.
};
或者:
class Inner {
public:
Inner() : mX(Outer::Foo(2, 3)) {} // Using initialize list
private:
double mX;
};
参考:
C++ 核心指南
推荐阅读
- mod-rewrite - 为什么 Apache mod_rewrite 会删除 uri 部分?
- sql - 意外的标记 ”
在“”之后找到“ - c# - 比较两个数据集并在 c# 中列值为 1 时添加星号
- maven - 在 Docker 容器中运行 Karaf 时,如何运行需要访问 maven 存储库的控制台命令?
- javascript - 如何在特定条件后自动关闭 Chrome 浏览器?
- iis - IIS根据子域将请求路由到不同的端口
- javascript - 大家好,我正在尝试使用 js 创建一个侧滑菜单,但我遇到了这个 msg。意外的“常量”。const navSlide = () => {
- for-loop - 增长顺序 - 嵌套循环,具有双倍索引的外部循环
- macos - 无法将 iPad 应用程序转换为 Mac 应用程序:Xcode 找不到任何与“maccatalyst.com...”匹配的 Mac Catalyst 应用程序开发配置文件
- laravel - Laravel 与 mongodb 聚合,选择日期