我们只说两个班级A
和B
这是两个代码
class A
{
public:
int x;
};
class B
{
public:
int y;
void FindY() { y = x + 12; }
};
void something()
{
A fs;
B fd;
fs.x = 10;
fd.FindY();
}
问题是我想要访问x,但我不想传递任何东西作为我的函数的参数我看看朋友和继承但是两者似乎都没有帮助我,如果我错了,请纠正我。登记/>
一些我如何在函数FindY()
中找到x
我要使用静态方法,但在我的情况下,我得到这个错误。
错误2错误LNK2001:未解析的外部符号“public:static class std::vector<class GUIDialog *,class std::allocator<class GUIDialog *> > Window::SubMenu" (?SubMenu@Window@@2V?$vector@PAVGUIDialog@@V?$allocator@PAVGUIDialog@@@std@@@std@@A) C:\Users\Owner\documents\visual studio 2010\Projects\Monopoly\Monopoly\Window.obj
这是我如何宣布它
static vector<GUIDialog *> SubMenu;
因为这行
我得到了这个错误SubMenu.resize(3);
答案 0 :(得分:8)
三种不同的方法:
Make B :: FindY将A对象作为参数
class B {
public:
void FindY(const A &a) { y = a.x + 12; }
};
制作A :: x静态
class A {
public:
static int x;
};
class B {
public:
void FindY() { y = A::x + 12; }
};
让B从A继承。
class B : public A {
public:
void FindY() { y = x + 12; }
};
CashCow还在他的回答中指出了更多的方法。
答案 1 :(得分:1)
实际上,x
不是类A
的变量,而是类A
的对象变量(“实例”)。至少有两种方法可以从x
访问B::findY
而不向函数传递任何内容:
A
函数中实例化类B::findY
的对象:class B { public: int y; void FindY() { A a; y = a.x + 12; } };
x
成为静态变量,这样它就是类本身的变量。在这种情况下,您不需要实例化对象,但该变量对于A
类型的所有对象都是通用的(因此对于不同的对象,您不能具有x
的不同值):class A { public: static int x; }; class B { public: int y; void FindY() { y = A::x + 12; } };
答案 2 :(得分:1)
假设A是正确的并且您无法更改它,即x是成员变量,您将需要A的实例才能使用其x成员。
因此说我们可以修改B但是你需要FindY()来不带参数。
因此,我们需要使用较早的调用引入A并将其存储为类成员。
class B
{
public:
A a;
int y;
void FindY() { y = a.x + 12; }
};
这只是一个大纲。这是“functor”类通常所做的,其中函数是operator()并且需要固定数量的预期参数,但我们需要更多。整个boost :: bind基于这个原则。