2013-10-13 40 views
0

我有两个类,它们各自的名称空间。
类A具有B类的一个对象,并可以调用从类B.如何从另一个类中访问主类中定义的classA对象


我想在B类调用从类的方法的为好,为此,我包括“classA.h”的方法classB.h,但是当我这样做,我得到一个错误说..

error C2653: 'classB_namespace' : is not a class or namespace name 

我使用Win32 SDK中的这个项目,我已经定义在classA.cpp的WinMain()中,WinMain函数()我有一个classA的对象,它调用classB中定义的wndProct。

我想从classB中访问这个classA对象(以便在classA中调用该方法,这就是为什么我正在做所有这些..)。

如何,更重要的是,它可以做到吗? 我在WinMain()中的classA对象上使用了extern,但没有工作。

所以底线是,我无法使用WinMain()中定义的对象在classA中定义的classB中调用该方法。

+5

我们需要你正在谈论的代码给你一个答案。 –

+0

没有代码,没有道理 – YaleCheung

+1

A类有一个B的对象,B也想包括A,我认为循环'#include'不能完成。 – MRB

回答

2

由于C++是一次编译的,所以很可能(但不是绝对的,没有看到的代码)出现这个问题。因此,#include与其他语言(如C#或Java)中的usage-directive不同,您必须跟踪所有定义的正确顺序 - 每个类必须在使用前声明(甚至完全定义),否如果代码位于单个文件或多个包含头文件中,则至关重要。命名空间并没有太多改变 - 定义的顺序必须保持不变。

这是错误的代码,因为它被宣布之前提到的B类:

class A { 
    B objB; 
}; 

class B { 
    A *parent; 
}; 

正确的声明顺序是:

class A; 

class B { 
    A *parent; 
}; 

class A { 
    B objB; 
}; 

或者,在单独的命名空间中的每个类,它会像这样:

namespace classA_namespace { 
    class A; 
} 

namespace classB_namespace { 
    class B { 
    classA_namespace::A *parent; 
    }; 
} 

namespace classA_namespace { 
    class A { 
    classB_namespace::B objB; 
    }; 
} 
+0

是的..就是这个问题..正如@M M和@Mhamhammad上面所描述的那样。它是一个循环依赖问题。 我需要的是更多的实践设计在c + +。 我一直在C编写我的生活。需要一段时间才能使用。 感谢您的帮助。 – 2am

+1

@ 2am有关C++设计模式的一个小实例 - 每个类都在其独立的名称空间中并不常见,也不是很好的做法。命名空间用于对相关类进行分组(比如功能是将组相关的代码或类组合到相关的函数中),并且通常一个命名空间包含多于一个类(该例子是'std'命名空间) –

+0

是的,那就是我观察到的在过去几周:P 无论如何,你能推荐任何优秀的C++设计模式书吗? 我很擅长C++编程,但设计部分是我必须更加努力的地方。 – 2am

相关问题