可能重复:
Can inner classes access private variables?
Inner class accessing outer class
我有一些嵌套的简单类,所以他们可以在没有额外输入的情况下与变量交互,但是我的编译器给了我一个错误。如何在不使用& time作为函数输入或在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;
}
答案 0 :(得分:2)
你收到错误的原因(即使你没有发布实际错误,我设法弄明白了,请将来再做),是你实际上没有实例Container
类函数内的Vect
类的em>。您可能应该考虑这里的设计,但要快速解决(并且“脏”),您可以添加一个在子类中设置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;
};
我仍然认为这是一种肮脏的解决方案(但不像我的第一次那么肮脏),你应该考虑改变设计。
答案 1 :(得分:2)
“......嵌套类的成员对封闭类的成员没有特殊访问权限,也没有对已经授予封闭类的友谊的类或函数;应遵守通常的访问规则(第11节)。封闭类的成员对嵌套类的成员没有特殊访问权限;应遵守通常的访问规则(第11条)......“
因此,让他们成为朋友。
答案 2 :(得分:1)
内部类无法访问外部类的非静态变量。这是C ++,我们必须在使用它的非静态成员数据之前实例化该对象。因此,如果您想使用您的设计,您有两种选择:
将变量(在您的情况下为时间)更改为静态。但是对于所有Container类,您只有一个时间副本。
让嵌套类包含指向父类的指针。以下代码类似于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;
};
答案 3 :(得分:0)
最基本的,类是对等类。在OOPs原则中,每个类都被封装。那么内部类如何直接访问另一个类的成员。它违反了OOP的基本原则。