如何从上面定义的类中访问类?

时间:2011-11-02 19:55:37

标签: c++

如果我有A和B类,我如何在A中创建对B的引用?我读到你需要使用指针或引用,但我找不到更多。这是我正在谈论的一个例子:

class B;

class A {
    public: 

    B * b_pointer;

    void setSelf(B * given_b_pointer) {
        b_pointer = given_b_pointer;
    };

    void printBName() {
        print (b_pointer.my_name);
    };
};

class B {
    public:

    string my_name;

    void setSelf(string my_given_name) {
        my_name = my_given_name;
    };
}

这给了我几个错误。我做错了什么,我该如何解决?

编辑:相关的错误消息:

  

错误:请求'((B *)this)中的成员'my_name' - > A :: b_pointer',其中   是非类型'B *'。

稍微编辑错误消息,用psuedo-class名称替换实际的类名。

4 个答案:

答案 0 :(得分:5)

[更新] 您需要转发声明B类,并且在声明B类成员之前不能使用它的任何成员,因此将printBName的声明移到代码中文件。

class B; //Forward declaration

class A {
    public: 
    B * b_ref;

    ...

    void printBName(); //Need to forward declare this as well
};

class B {
    ...
};

//Now define printBName
void A::printBName(){
    print (b_ref->my_name);// use -> to dereference b_ref
}

答案 1 :(得分:1)

尝试

class B 
{
   public:

   string my_name;

   void setSelf(string my_given_name) {
       my_name = my_given_name;
    };
}

class A 
{ 
    public: 

    B * b_ref;

    void setSelf(B * given_b_ref) {
        b_ref = given_b_ref;
    };

    void printBName() {
        print (b_ref->my_name);
    };
};

答案 2 :(得分:1)

A::setSelf函数编译时没有错误,因为它只操纵指向B的指针,而不是B的成员。一旦您尝试访问BA::printBName的成员,编译器就会抱怨,因为除了它是一个类之外,它还不知道关于B的任何问题。

解决方法是在定义A::printBName之后定义类外的函数B。所以在class A

的定义中
void setSelf(B * given_b_ref) ; // No definition, just declaration

然后,在class B

的定义之后
void A::printBName() { // Here's the definition
    print (b_ref.my_name);
}

另外,请注意函数定义在结束括号后不需要分号。

答案 3 :(得分:0)

使用前向声明或在B之前声明课程A

class B;
class A {
    B* ref;
    // Your stuff here
};

class B {
    // Other stuff
}

但是如果要创建两个类,则更喜欢使用两个单独的文件。因此,您必须在include "B.hpp"声明之前class A

编辑:

如果您看到错误,则表示您不能将前向声明的成员用作类型。因此,您可以在之前声明该类,或者更好创建一个表示该类所需行为的接口,并在之前声明它。

然后您可以根据需要声明您的类,因为接口没有任何成员,因此可以使用前向声明,并且类使用接口,所以不关心任何可能的未来类定义:)

编辑2:

您的错误告诉我们您不需要类访问权限,只需更正您使用的运算符:

你写了

print (b_ref.my_name);

而不是:

print (b_ref->my_name);