一个非常简单的c ++ oop问题

时间:2009-11-06 00:35:06

标签: c++ oop

我在这里挣扎着语法:希望这个问题很简单,我只是简单地说明这一点。

具体来说,如果我在另一个类中嵌套一个类,例如

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()

^^这似乎不起作用。这是简化的(所以可能在某处错字)。但我知道类正在设置正常,它只是我无法访问其中的方法,如果它们是嵌套的。我可能做错了什么?

非常感谢。

5 个答案:

答案 0 :(得分:3)

你的an_instance_of_b不是a的成员,而是a的构造函数中的局部变量(构造函数声明缺少括号)。

这里会发生的是,当你创建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;
}