疑惑???

摩尔信使MThings
企业官方账号
2012-03-09 06:56:47

///////////////////////////////////////////////////////////////
//Base.h
#pragma once
class CBase
{
public:
CBase();
~CBase(void);

private:
void fun();
};

///////////////////////////////////////////////////////////////
Base.cpp
#include "StdAfx.h"
#include "Base.h"

CBase::~CBase(void)
{

}

CBase::CBase()
{

}

void CBase::fun()
{
}

//////////////////////////////////////////////////////
mian.cpp
#include "stdafx.h"

#define private public ///

#include "Base.h"

#include <map>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
CBase Object;
Object.fun();

return 0;
}


提示error LNK2019: 无法解析的外部符号 "public: void __thiscall CBase::fun(void)" (?fun@CBase@@QAEXXZ),该符号在函数 _main 中被引用

但是将

//Base.h
#pragma once
class CBase
{
public:
CBase();
~CBase(void);

private:
void fun() {};
};

就没有问题了

很奇怪#define private public
作用域已经到base头文件了,但是源文件连接不上
...全文
413 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
zmkkobe 2012-03-11
  • 打赏
  • 举报
回复
如果不改的话我是弄不出来
qscool1987 2012-03-10
  • 打赏
  • 举报
回复
另外我顺便鄙视下codeblock这款编译器,你用它可以这么搞,具体是为什么,我猜测它是先编译main.cpp结果就替换掉了base.h里的宏,然后编译的base.cpp,但是这样搞完全就是乱弹琴了。
qscool1987 2012-03-10
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 zhoutanliang 的回复:]
引用 18 楼 qscool1987 的回复:
这是cpp文件单独编译导致的问题,而宏又只是简单替换
main里面调用的函数需要的是public,但是找不到,因为base.cpp里面的函数编译时被附加了private信息。解决这个问题的办法就是

C/C++ code

//base.cpp
#define private public
#include "Base.h"

这……
[/Quote]
我只能说没有办法,如果可以在外部这样搞那C++所谓的封装就没有一点意义
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 qscool1987 的回复:]
这是cpp文件单独编译导致的问题,而宏又只是简单替换
main里面调用的函数需要的是public,但是找不到,因为base.cpp里面的函数编译时被附加了private信息。解决这个问题的办法就是

C/C++ code

//base.cpp
#define private public
#include "Base.h"

这里也加上这个宏定义那么就能保证一致性
至于你说的……
[/Quote]

有没有一种解决办法,不修改Base头文件、源文件

在外面怎么办?
qscool1987 2012-03-10
  • 打赏
  • 举报
回复
另外不同的编译器处理还不同,这两种形式我在codeblock上试过都可以,在vc上是和你说的情况一样。这个扯到编译原理上了,每个编译器处理还不同
menzi11 2012-03-10
  • 打赏
  • 举报
回复
在CBase的cpp中,fun函数依然是私有的,而在main中,用宏
替换了private使得fun函数的声明变成了公有的,这将导致
编译器不认为cpp中的fun函数和CBase类中声明的fun函数是同一个
函数,因此出现连接错误.而将函数的实现写在.h里面实际上此函数依然
有两个副本,一个private的一个public的.

解决方法是把#define private public也加到CBase的cpp里.
另外

#define private public.......这个太危险了吧...
qscool1987 2012-03-10
  • 打赏
  • 举报
回复
这是cpp文件单独编译导致的问题,而宏又只是简单替换
main里面调用的函数需要的是public,但是找不到,因为base.cpp里面的函数编译时被附加了private信息。解决这个问题的办法就是

//base.cpp
#define private public
#include "Base.h"

这里也加上这个宏定义那么就能保证一致性
至于你说的在类内部定义就能通过,原因是inline了,此时根本不要外部链接,main.cpp编译的时候只是将函数体插入到调用处。
qixing1115 2012-03-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zhoutanliang 的回复:]
引用 8 楼 menzi11 的回复:
在CBase的cpp中,fun函数依然是私有的,而在main中,用宏
替换了private使得fun函数的声明变成了公有的,这将导致
编译器不认为cpp中的fun函数和CBase类中声明的fun函数是同一个
函数,因此出现连接错误.而将函数的实现写在.h里面实际上此函数依然
有两个副本,一个private的一个public的.

解决方法是把#……
[/Quote]
可以吧
蓝枫10 2012-03-10
  • 打赏
  • 举报
回复
private:
void fun() {};
如果这样写的话
包含头文件时,把fun函数重新编译了一次···
所以fan函数是publi函数
就可以调用了···
也有点搞不清楚了···
minchieh 2012-03-10
  • 打赏
  • 举报
回复
CBase这个类先编译完 生成obj临时文件,此时private还是private
然后你去主函数去链接,其实还是private
因为include,头文件会在主类中被再编一次,主类中关于CBase的声明中private被替换成了public
蓝枫10 2012-03-10
  • 打赏
  • 举报
回复
私有函数外部直接调用了额···
蓝枫10 2012-03-10
  • 打赏
  • 举报
回复
private:
void fun();
私有的函数 你外部直接调用了···
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 menzi11 的回复:]
在CBase的cpp中,fun函数依然是私有的,而在main中,用宏
替换了private使得fun函数的声明变成了公有的,这将导致
编译器不认为cpp中的fun函数和CBase类中声明的fun函数是同一个
函数,因此出现连接错误.而将函数的实现写在.h里面实际上此函数依然
有两个副本,一个private的一个public的.

解决方法是把#define private public……
[/Quote]

这个试过,还是不行

貌似还可以 深度解释一下原因
忘世麒麟 2012-03-10
  • 打赏
  • 举报
回复
对关键字不建议用#define
gold_water 2012-03-10
  • 打赏
  • 举报
回复
oniisama 2012-03-10
  • 打赏
  • 举报
回复
LS正解。编译Base.cpp时fun是private,链接mian的目标文件时想找public的fun自然是找不到。
LoveYouSelf 2012-03-10
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 binzo 的回复:]
C/C++ code

#define private public

楼主真有想法。
[/Quote]

敢这么干! 写语言的不是傻子,不会被这么一下就坏了自己的封装性
Binzo 2012-03-10
  • 打赏
  • 举报
回复
#define private public

楼主真有想法。
lh1342988550 2012-03-10
  • 打赏
  • 举报
回复
没了解...VS2010挺好用的,要不你试试?我用VS2010都没出过这样的问题...
ri_aje 2012-03-09
  • 打赏
  • 举报
回复
编译的时候有没有编译 Base.cpp 并且链接其生成的 object file,看错误提示应该是编译器找不到 fun 的定义,与 private public 作用域没有关系,后者会导致编译错误,而非链接错误。
加载更多回复(6)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧