2012-03-06 137 views
-4

在下面的程序:关于C++对象创建

using namespace std; 
class c1; 
class c2; 
int main(int argc,char* argv[]) 
{ 
    **c1 obj; 
    c2 obj_c2 = obj.method1();** 
    return0; 
} 
class c1 
{ 
public: 
    c2 method1() 
    { 
    c2 obj1; 
    return obj1; 
    } 
}; 
class c2 
{ 
public: 
    int method2() 
    { 
    return 1; 
    } 

}; 

在main函数,两行代码是给错误。我无法编译。

+4

我们可以自己看看,当然。但如果你真的可以在问题中发布你的错误,这将是很好的。使它更容易遵循。 – Bart 2012-03-06 14:21:38

+0

'main'第二行的两个星号有什么意义? – 2012-03-06 14:22:10

+0

@daknok_t他试图突出显示这两行,以便为他提供错误。 – Rup 2012-03-06 14:22:32

回答

4

您需要定义两个类,然后才能使用它们作为全类型:

class c2 
{ 
public: 
    int method2() 
    { 
    return 1; 
    } 

}; 

class c1 
{ 
public: 
    c2 method1() 
    { 
    c2 obj1; 
    return obj1; 
    } 
}; 

int main(int argc,char* argv[]) 
{ 
    c1 obj; 
    c2 obj_c2 = obj.method1(); 
    return 0; 
} 

预先声明不削减在这种情况下,因为你不仅宣告指针,但实际尝试实例化这些类型的对象。

但是,我建议你将你的类声明移动到头文件中。

由于相同的推理,您需要在c1之前定义c2,因为c1需要使用完整类型c2

+0

完全申明意味着什么? – Muthu 2012-03-06 14:22:34

+0

@Muthu不仅仅是一个前向声明,而是在你使用类之前移动完整的声明。 – 2012-03-06 14:23:30

+0

'class X;'是一个声明。 'class X {};'是一个定义。成员函数可能尚未定义,但类型本身是。 – 2012-03-06 14:29:46

5

您无法定义不完整类型的变量。该定义必须是前主可见(和c2c1之前,如果你定义的类中的成员函数):

class c2 { 
    // ... 
}; 

class c1 { 
    // ... 
}; 

int main() { 
    // ... 
} 

此外,在未来,始终在你的问题的错误。

+3

值得指出的是,你重新定义了“c2”和“c1”的定义。 – hmjd 2012-03-06 14:23:37

+0

@hmjd:我确实指出了。 – 2012-03-06 14:24:44

+0

您是否编辑过初始文章?如果没有,然后道歉。 – hmjd 2012-03-06 14:25:54

1

c1c2是您尝试在main中使用它们时不完整的类型。在main之前移动他们的声明(a.k.a机构)。 main中的return后面缺少一个空格。

我认为既不**'是实际计划的一部分。