如果我有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名称替换实际的类名。
答案 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
的成员。一旦您尝试访问B
中A::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);