2010-12-22 157 views
1

我们只是说我们有两个类,AB
这是对他们俩的代码如何从其他类访问不同类中的变量?

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:无法解析的外部符号“公用:静态类std::vector<class GUIDialog *,class std::allocator<class GUIDialog *> > Window::SubMenu" ([email protected]@@[email protected]@@[email protected]@@@[email protected]@@[email protected]@A) C:\Users\Owner\documents\visual studio 2010\Projects\Monopoly\Monopoly\Window.obj 这是我如何宣称它

static vector<GUIDialog *> SubMenu; 

我得到的,因为

SubMenu.resize(3); 
+3

`x`不无A`的`一个实例存在。你需要从* somewhere *中得到它。 – GManNickG 2010-12-22 09:35:57

+2

您需要创建类“A”的对象,然后使用“A.x”。你在问那个笏还是我错过了什么? – Naveen 2010-12-22 09:36:01

回答

7

三种不同的方法的这一行的错误:

  1. Make B :: FindY tak为E的甲对象作为参数

    class B { 
    public: 
        void FindY(const A &a) { y = a.x + 12; } 
    }; 
    
  2. 做出:: X静态

    class A { 
    public: 
        static int x; 
    }; 
    class B { 
    public: 
        void FindY() { y = A::x + 12; } 
    }; 
    
  3. 制作乙从A继承

    class B : public A { 
    public: 
        void FindY() { y = x + 12; } 
    }; 
    

CashCow还指出更在他的回答中做到这一点。

1

就这样,x不是A类的变量,而是类A的对象变量(“实例”)。至少有两种方法可以使x访问从B::findY不经过任何的功能:

  • 实例化B::findY函数内部A类的一个对象:
 
    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; } 
    }; 
1

假设一个是正确的,你不能改变它,即x是一个成员变量,你需要一个A的实例才能使用它的x成员。

因此,我们可以修改B,但是您需要FindY()来不带参数。

因此,我们需要在A带来与之前的通话并将其存储为一个类的成员。

class B 
{ 
public: 
    A a; 
    int y; 
    void FindY() { y = a.x + 12; } 
}; 

这只是一个提纲。对于函数为operator()的“函子”类来说,这是常用的方法,并且需要固定数量的期望参数,但我们需要更多。整个boost :: bind基于这个原理。