
C++代码组织上的问题,交叉引用后编译报错说未定义标识符
/*////////////////////////////////////////////////////PlusA.h*/#pragmaonce#include<st...
/*////////////////////////////////////////////////////
PlusA.h
*/
#pragma once
#include <string>
#include <iostream>
#include "PlusB.h"
using namespace std;
class CPlusA
{
public:
CPlusA(const string& str);
virtual ~CPlusA(void);
CPlusB& GetB(void);
private:
CPlusB m_b;
string m_str;
};
/*////////////////////////////////////////////////////
PlusA.cpp
*/
#include "StdAfx.h"
#include ".\plusa.h"
CPlusA::CPlusA(const string& str):m_b(str), m_str(str)
{}
CPlusA::~CPlusA(void)
{}
CPlusB& CPlusA::GetB(void)
{
return this->m_b;
}
/*////////////////////////////////////////////////////
PlusB.h
*/
#pragma once
#include <string>
#include <iostream>
#include "PlusA.h"
using namespace std;
class CPlusB
{
public:
CPlusB(const string& str);
virtual ~CPlusB(void);
CPlusA& GetA(void);
private:
CPlusA m_a;
string m_str;
};
/*////////////////////////////////////////////////////
PlusB.cpp
*/
#include "StdAfx.h"
#include ".\plusb.h"
CPlusB::CPlusB(const string& str):m_a(str), m_str(str)
{}
CPlusB::~CPlusB(void)
{}
CPlusA& CPlusB::GetA(void)
{
return this->m_a;
}
这四个文件放到一个项目里编译时报:
PlusA.h(14): error C2143: 语法错误 : 缺少“;”(在“&”的前面)
PlusB.h(14): error C2143: 语法错误 : 缺少“;”(在“&”的前面)
PlusB.h(17): error C2146: 语法错误 : 缺少“;”(在标识符“m_a”的前面)
PlusA.h(17): error C2146: 语法错误 : 缺少“;”(在标识符“m_b”的前面)
PlusA.h(14): error C2501: “CPlusA::CPlusB” : 缺少存储类或类型说明符
PlusA.h(17): error C2501: “CPlusA::CPlusB” : 缺少存储类或类型说明符
PlusA.h(14): error C2501: “CPlusA::GetB” : 缺少存储类或类型说明符
PlusA.h(17): error C2501: “CPlusA::m_b” : 缺少存储类或类型说明符
PlusB.h(14): error C2501: “CPlusB::CPlusA” : 缺少存储类或类型说明符
PlusB.h(17): error C2501: “CPlusB::CPlusA” : 缺少存储类或类型说明符
PlusB.h(14): error C2501: “CPlusB::GetA” : 缺少存储类或类型说明符
PlusB.h(17): error C2501: “CPlusB::m_a” : 缺少存储类或类型说明符
PlusB.h(14): warning C4183: “GetA”: 缺少返回类型;假定为返回“int”的成员函数
PlusA.h(14): warning C4183: “GetB”: 缺少返回类型;假定为返回“int”的成员函数 展开
PlusA.h
*/
#pragma once
#include <string>
#include <iostream>
#include "PlusB.h"
using namespace std;
class CPlusA
{
public:
CPlusA(const string& str);
virtual ~CPlusA(void);
CPlusB& GetB(void);
private:
CPlusB m_b;
string m_str;
};
/*////////////////////////////////////////////////////
PlusA.cpp
*/
#include "StdAfx.h"
#include ".\plusa.h"
CPlusA::CPlusA(const string& str):m_b(str), m_str(str)
{}
CPlusA::~CPlusA(void)
{}
CPlusB& CPlusA::GetB(void)
{
return this->m_b;
}
/*////////////////////////////////////////////////////
PlusB.h
*/
#pragma once
#include <string>
#include <iostream>
#include "PlusA.h"
using namespace std;
class CPlusB
{
public:
CPlusB(const string& str);
virtual ~CPlusB(void);
CPlusA& GetA(void);
private:
CPlusA m_a;
string m_str;
};
/*////////////////////////////////////////////////////
PlusB.cpp
*/
#include "StdAfx.h"
#include ".\plusb.h"
CPlusB::CPlusB(const string& str):m_a(str), m_str(str)
{}
CPlusB::~CPlusB(void)
{}
CPlusA& CPlusB::GetA(void)
{
return this->m_a;
}
这四个文件放到一个项目里编译时报:
PlusA.h(14): error C2143: 语法错误 : 缺少“;”(在“&”的前面)
PlusB.h(14): error C2143: 语法错误 : 缺少“;”(在“&”的前面)
PlusB.h(17): error C2146: 语法错误 : 缺少“;”(在标识符“m_a”的前面)
PlusA.h(17): error C2146: 语法错误 : 缺少“;”(在标识符“m_b”的前面)
PlusA.h(14): error C2501: “CPlusA::CPlusB” : 缺少存储类或类型说明符
PlusA.h(17): error C2501: “CPlusA::CPlusB” : 缺少存储类或类型说明符
PlusA.h(14): error C2501: “CPlusA::GetB” : 缺少存储类或类型说明符
PlusA.h(17): error C2501: “CPlusA::m_b” : 缺少存储类或类型说明符
PlusB.h(14): error C2501: “CPlusB::CPlusA” : 缺少存储类或类型说明符
PlusB.h(17): error C2501: “CPlusB::CPlusA” : 缺少存储类或类型说明符
PlusB.h(14): error C2501: “CPlusB::GetA” : 缺少存储类或类型说明符
PlusB.h(17): error C2501: “CPlusB::m_a” : 缺少存储类或类型说明符
PlusB.h(14): warning C4183: “GetA”: 缺少返回类型;假定为返回“int”的成员函数
PlusA.h(14): warning C4183: “GetB”: 缺少返回类型;假定为返回“int”的成员函数 展开
2个回答
展开全部
在类的声明里不要声明另一个类的对象,而要声明类的指针,比如
class A{
...
class B b;
...
};
是错的,因为在编译A时,无法确定B的大小,应该用
class A{
...
class B *b;
...
};
因为指针大小是固定的。
另外,嵌套声明时,在其中一个类的声明前面加上另一个类的预声明即可。
比如
在A.h里面写
class B;
class A{
...
};
在B.h里面写
class B{
...
};
class A{
...
class B b;
...
};
是错的,因为在编译A时,无法确定B的大小,应该用
class A{
...
class B *b;
...
};
因为指针大小是固定的。
另外,嵌套声明时,在其中一个类的声明前面加上另一个类的预声明即可。
比如
在A.h里面写
class B;
class A{
...
};
在B.h里面写
class B{
...
};
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询