我在这里挣扎着语法:希望这个问题很简单,我只是简单地说明这一点。
具体来说,如果我在另一个类中嵌套一个类,例如
class a
{
a //the constructor
{
b an_instance_of_b // an instance of class b
}
};
class b
{
public:
foo()
{
cout << "foo";
}
};
当我尝试通过执行此操作在B中访问此方法时:
a an_instance_of_a; //declare an instance of a
an_instance_of_a.an_instance_of_b.foo()
^^这似乎不起作用。这是简化的(所以可能在某处错字)。但我知道类正在设置正常,它只是我无法访问其中的方法,如果它们是嵌套的。我可能做错了什么?
非常感谢。答案 0 :(得分:3)
你的
不是a的成员,而是a的构造函数中的局部变量(构造函数声明缺少括号)。an_instance_of_b
这里会发生的是,当你创建a的实例时,它会创建并立即销毁b的实例,然后它会离开构造函数,然后创建一个实例。
答案 1 :(得分:1)
试试这个:
class B; // prototype declaration
class hello {
hello() { //the constructor
B an_instance_of_b; // an instance of class b
}
};
class B {
public:
void foo() {
cout << "foo";
}
};
首先,它们没有嵌套在你的例子中。无论如何,也没有明显的需要这样做。
其次,存在一些功能和数据声明错误。
最后,您需要B
的原型,以便hello::an_instance_of_b
声明可以作为前向参考。或者,只需在B
之前声明hello
。
答案 2 :(得分:1)
这对我来说适用于Linux上的g ++:
#include <iostream>
using namespace std;
class B {
public:
void foo() {
cout << "foo" << endl;
}
};
class A {
public:
B b;
};
int main() {
A a;
a.b.foo();
}
我认为b在你的情况下可能只是私人的。
答案 3 :(得分:1)
尝试发布编译和编译的确切代码运行。你可以删除不必要的函数,但上面的代码甚至都不会编译,因此很难确定问题。
然而,对它进行了抨击,an_instance_of_b默认为受保护,不是吗?这意味着您将无法在课堂外访问它。同样根据您发布的代码判断an_instance_of_b甚至不是类变量,它是构造函数中的局部变量。您需要添加一个Getter来检索实例。也许这样的事情(我暂时没有做过C ++):
class ClassA
{
public:
hello() { _ClassB = new ClassB(); }
ClassB GetClassB() { return _ClassB; }
private:
ClassB _ClassB;
}
class ClassB
{
public:
foo() {}
}
void SomeRandomFunction()
{
ClassA classA = new ClassA();
classA.GetClassB().foo();
}
答案 4 :(得分:0)
我没有看到一个类嵌套在另一个类中。
在类“b”开始之前,我看到带有括号分号的类“a”结尾。因此,没有嵌套。
修改强>
我已重新格式化您的代码,以明确课程的开始/结束位置。
您在b an_instance_of_b
默认情况下,a
的构造函数是私有的。我想你想要一个public
构造函数。
编辑2
我认为这是你想要的代码:
class b; // forward declare "b" so that it is valid in class "a"
class a
{
public:
a(void) //Constructor is now public.
{
// Empty body. There is now a member variable
}
public:
b a_member_instance_of_b;
};
class b
{
// Note: no constructor.
public:
foo()
{
cout << "foo";
}
};
int main(void)
{
a an_instance_of_a;
an_instance_of_a.a_member_instance_of_b.foo();
return 0;
}