C++ 内部类无法访问外部类的成员
C++ Inner class not able to access Outer class's members
可能的重复:
内部类可以访问私人变量吗?
内类访问外班
我有一些简单的类嵌套,因此它们可以与变量相互作用而无需额外的输入,但是我的编译器给了我一个错误。我如何允许他们在不使用&时间作为函数输入或在VECT类内部的变量;的时间进行交互?
我尝试使用相同的逻辑,其中您可以在与函数原型相同的位置访问的数据访问的数据,而是包裹在类中。除其他类外,这对我使用的任何东西都很好。谁能解释为什么?
我已经标记了使用有问题的时间变量与定义之前的评论行的地方。
/*********/
#define MAX_POLY 3
class Container
{
public:
Container(void);
~Container(void);
float time;/*********/
class Vect
{
float P[MAX_POLY],iT;
public:
Vect(void){iT = 0.0f;P = {0,0,0};}
~Vect(void);
float GetPoly(int n){return P[n];}
float Render(void)
{
float t = time - iT;/*********/
float temp[2] = {0,0};
for(int n=0;n<MAX_POLY;n++)
{
temp[0] = P[n];
for(int m=0;m<n;m++)
temp[0] *= t;
temp[1] += temp[0];
}
return temp[1];
}
void SetPoly(int n,float f)
{
float t = time-iT;/*********/
P[0] = P[2]*t*t + P[1]*t + P[0];
P[1] = 2*P[2]*t + P[1];
//P[2] = P[2];
P[n] = f;
iT = time;/*********/
}
}X;
};
int main()
{
Container Shell;
Shell.X.SetPoly(0,5);
Shell.X.SetPoly(1,10);
Shell.X.SetPoly(2,-1);
for(int n=0;n<10;n++)
{
Shell.time = (float)n;
cout << n << " " << Shell.X.Render() << endl;
}
system("pause");
return 0;
}
您遇到错误的原因(即使您没有发布实际错误,我还是设法弄清楚了,请在将来这样做)在Vect
类功能中具有Container
类的实例。您可能应该在这里考虑设计的设计,但是要快速解决("脏"),您可以添加一个在子类中设置Container
实例的函数:
class Container
{
...
class Vect
{
Container *container;
public:
void SetContainer(Container &container)
{ this->container = &container; }
float Render(void)
{
float T = container->time - iT;
...
}
...
} X;
};
int main()
{
Container Shell;
Shell.X.SetContainer(Shell);
Shell.X.SetPoly(0,5);
...
}
编辑:使用构造函数设置对父对象的引用(感谢Juanchopanza):
class Container
{
...
Container()
: X(*this)
{ ... }
class Vect
{
Container& container;
public:
Vect(Container& cont)
: container(cont)
{ }
float Render(void)
{
float T = container.time - iT;
...
}
...
} X;
};
我仍然认为这是一种肮脏的解决方案(但不像我的第一个更脏),您应该考虑更改设计。
" ...嵌套班的成员无法特殊访问封闭班的成员,也没有授予封闭类友谊的类或功能;通常的访问规则(第11条)应遵守。封闭班的成员对嵌套班的成员没有特殊的访问权;通常的访问规则(第11条)应遵守。..."
因此,让他们成为朋友。
内类无法访问外部类的非静态变量。这是C ,我们必须在使用其非静态成员数据之前实例化对象。因此,如果您想使用设计,则有两种选择:
-
将变量(在您的情况下)更改为静态。但是您只有所有容器类的时间副本。
-
有嵌套类以包含指向父类的指针。以下代码类似于Joachim的解决方案,但我们不需要明确设置父。
class Container {
public:
Container() : X(this) {}
float time;
class Vect {
public:
Vect(Container* parent) : parent_(parent) {}
void foo() {
myT = parent->time;
}
private:
Container * parent_;
} X;
};
最大程度地说,类是类似的类。用原理封装了每个类。因此,内部类如何直接访问其他类的成员。它违反了OOP的基本原则。
- 在 C++ 中从类外部修改类的成员
- 用作默认参数的静态成员会导致无法解析的外部
- 使用静态 constexpr 成员的未解析外部符号
- 具有外部定义的默认特殊成员函数
- DLL+导出类+模板成员func=未解析的外部符号.任何修复的机会
- 从类C++外部调用指向成员方法的成员指针
- 在成员函数外部封闭类的定义中需要默认成员初始值设定项
- 作为成员的静态类模板实例会导致未解析的外部符号错误
- 为什么在类外部(但在头文件中)定义的类成员函数必须内联?
- LNK2001 SHA3 类成员的未解析外部符号
- 从内部类访问外部公共成员
- 在类外部初始化的 constexpr 静态成员的声明中是否需要 constexpr 说明符
- 类的成员函数,具有类外部的模板参数和默认参数
- 从不同的标头访问外部结构成员
- 访问说明符外部的 C++ 类成员
- (C++)(链接错误)模板成员函数上未解析的外部
- 是否有一种方法可以让公共成员在班级外部无法解码,而无需访问包装器功能
- 为什么私有继承对象允许成员函数将派生的*转换为基*,而外部不能
- 成员静态回调函数的外部"C"
- LNK 2001 未解析的外部在 NPPluginFuncs 结构 ptr 作为静态类成员