初学c++,请问如何在类外定义成员函数?

zhaoyu_me 2008-04-21 02:06:41
我想写一个简单的数组的类,代码如下,但是编译的时候老是提示说:
error LNK2005: "public: void __thiscall TIntArray::Show(int)" (?Show@TIntArray@@QAEXH@Z) 已经在 Array.obj 中定义
我试过把
void TIntArray::Show(int iCount)
{

}
写在类的内部就没有问题了,可一放到外部就出错,或者改成:
inline void TIntArray::Show(int iCount)
{

}
也没问题,但是我现在不想要它成为一个内联函数,请问我该怎么办呢?编译器是VS2008
class TIntArray
{
public:
//缺省构造函数
TIntArray(int iCount = DefaultSize);
TIntArray(int *pOriginalArray,int iCount);
//拷贝构造函数
TIntArray(TIntArray &IntArray);

void Show(int iCount);

protected:
private:
const static int DefaultSize = 512;
int iCount;
int *pArray;
};

void TIntArray::Show(int iCount)
{

}
//缺省构造函数
inline TIntArray::TIntArray(int iCount)
{
pArray = new int[iCount];
if (pArray)
{
while (iCount > 0)
{
pArray[iCount - 1] = 0;
}
}
else
{
WarnUser("无法分配内存");
}
}
...全文
1158 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
Maxwell 2008-04-25
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 zhaoyu_me 的回复:]
引用 25 楼 Maxwell 的回复:
引用 21 楼 zhaoyu_me 的回复:
引用 19 楼 Maxwell 的回复:
整个类岂不是连类定义都在里面?Array.cpp之外有没有用这个类的?有没有#include "Array.cpp"的地方?


整个程序由一个main.cpp和一个array.cpp构成,在main.cpp中#include "Array.cpp"


这就对了,array.cpp会被编译一次,编译main.cpp时又会编译一次,所以就出错了。
只要你把类定义写到array.h文件中,…
[/Quote]

inline函数在调用点需要能够看到代码,你把inline函数放到类定义的后面就可以了。
zhaoyu_me 2008-04-24
  • 打赏
  • 举报
回复
这样是可以啦
但是我想把所有的函数都放到类外定义啊,能实现吗?
zgjxwl 2008-04-24
  • 打赏
  • 举报
回复
//你直接在类中写
void Show(int iCount){}
//就可以了啊,或者,你把内联函数拷到头文件中
inline void TIntArray::Show(int iCount)
{

}
zhaoyu_me 2008-04-24
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 Maxwell 的回复:]
引用 21 楼 zhaoyu_me 的回复:
引用 19 楼 Maxwell 的回复:
整个类岂不是连类定义都在里面?Array.cpp之外有没有用这个类的?有没有#include "Array.cpp"的地方?


整个程序由一个main.cpp和一个array.cpp构成,在main.cpp中#include "Array.cpp"


这就对了,array.cpp会被编译一次,编译main.cpp时又会编译一次,所以就出错了。
只要你把类定义写到array.h文件中,然后main.cpp中#include "Array.h"就可…
[/Quote]
按这个方法确实可以了,但是有有了新问题:无法定义inline函数

头文件:
class TIntArray
{
public:
//缺省构造函数
TIntArray(int iCount = DefaultCount);
TIntArray(int *pOriginalArray,int iCount = DefaultCount);
//拷贝构造函数
TIntArray(TIntArray &IntArray);

inline void Show(int iCount);

private:
const static int DefaultCount = 512;
int iCount;
int *pArray;
};
CPP文件:
#include "TArray.h"
inline void TIntArray::Show(int iCount)
{

}

//缺省构造函数
TIntArray::TIntArray(int iCount)
{
pArray = new int[iCount];
if (pArray)
{
while (iCount > 0)
{
pArray[iCount - 1] = 0;
}
}
else
{
WarnUser("无法分配内存");
}
}
像这样写再不调用Show函数的时候可以编译通过,但一旦调用了Show函数就出现以下提示:
error LNK2001: 无法解析的外部符号 "public: void __thiscall TIntArray::Show(int)" (?Show@TIntArray@@QAEXH@Z)
zgjxwl 2008-04-24
  • 打赏
  • 举报
回复
你还是去看书把
采用多文件结构的时候,内联函数是很特别的,与其他不同的
一个内联函数,需要在每个调用它的编译单元给出一个完全一致的实现
还有,以后不要使用#include "Array.cpp" ,类似这种情况
这都是不好的编程风格,不推荐使用,因为这样很容易使得重复定义
zhaoyu_me 2008-04-24
  • 打赏
  • 举报
回复
谢谢楼上高手
不过我还想知道有没有办法能够实现在头文件中只写声明,而所有定义都在cpp文件中实现但又能够实现inline和非inline两种函数呢?
看来c++还真是复杂啊
zgjxwl 2008-04-24
  • 打赏
  • 举报
回复

//可以,你把它拷到头文件中不就是类外定义了吗,在类里的叫声明
inline void TIntArray::Show(int iCount)
{

}

Alix-Lei 2008-04-23
  • 打赏
  • 举报
回复
移到cpp file里面去
zhaoyu_me 2008-04-23
  • 打赏
  • 举报
回复
怎么不能回帖了
matrixdwy 2008-04-23
  • 打赏
  • 举报
回复
在头文件里面加上


#ifndef ARRAY_H
#define ARRAY_H

你的代码

#endndef //ARRAY_H
matrixdwy 2008-04-23
  • 打赏
  • 举报
回复
在头文件里面加上


#ifndef ARRAY_H
#define ARRAY_H

你的代码

#endndef //ARRAY_H
zhaoyu_me 2008-04-23
  • 打赏
  • 举报
回复
怎么不能回复了?
zhaoyu_me 2008-04-23
  • 打赏
  • 举报
回复
按楼上的方法确实可以了,但是有有了新问题:无法定义inline函数

头文件:
class TIntArray
{
public:
//缺省构造函数
TIntArray(int iCount = DefaultCount);
TIntArray(int *pOriginalArray,int iCount = DefaultCount);
//拷贝构造函数
TIntArray(TIntArray &IntArray);

inline void Show(int iCount);

private:
const static int DefaultCount = 512;
int iCount;
int *pArray;
};
CPP文件:
#include "TArray.h"
inline void TIntArray::Show(int iCount)
{

}

//缺省构造函数
TIntArray::TIntArray(int iCount)
{
pArray = new int[iCount];
if (pArray)
{
while (iCount > 0)
{
pArray[iCount - 1] = 0;
}
}
else
{
WarnUser("无法分配内存");
}
}
像这样写再不调用Show函数的时候可以编译通过,但一旦调用了Show函数就出现以下提示:
error LNK2001: 无法解析的外部符号 "public: void __thiscall TIntArray::Show(int)" (?Show@TIntArray@@QAEXH@Z)
zhaoyu_me 2008-04-23
  • 打赏
  • 举报
回复
按楼上的方法确实可以了,但是有有了新问题:无法定义inline函数

头文件:
class TIntArray
{
public:
//缺省构造函数
TIntArray(int iCount = DefaultCount);
TIntArray(int *pOriginalArray,int iCount = DefaultCount);
//拷贝构造函数
TIntArray(TIntArray &IntArray);

inline void Show(int iCount);

private:
const static int DefaultCount = 512;
int iCount;
int *pArray;
};
CPP文件:
#include "TArray.h"
inline void TIntArray::Show(int iCount)
{

}

//缺省构造函数
TIntArray::TIntArray(int iCount)
{
pArray = new int[iCount];
if (pArray)
{
while (iCount > 0)
{
pArray[iCount - 1] = 0;
}
}
else
{
WarnUser("无法分配内存");
}
}
像这样写再不调用Show函数的时候可以编译通过,但一旦调用了Show函数就出现以下提示:
error LNK2001: 无法解析的外部符号 "public: void __thiscall TIntArray::Show(int)" (?Show@TIntArray@@QAEXH@Z)
zhaoyu_me 2008-04-23
  • 打赏
  • 举报
回复
按楼上的方法确实可以了,但是又有新的问题了:如果我想定义一个inline的函数就不行了,当我想在类外定义一个inline函数的时候:
头文件:
class TIntArray
{
public:
//缺省构造函数
TIntArray(int iCount = DefaultCount);
TIntArray(int *pOriginalArray,int iCount = DefaultCount);
//拷贝构造函数
TIntArray(TIntArray &IntArray);

inline void Show(int iCount);

private:
const static int DefaultCount = 512;
int iCount;
int *pArray;
};
cpp文件:
#include "TArray.h"
inline void TIntArray::Show(int iCount)
{

}

//缺省构造函数
TIntArray::TIntArray(int iCount)
{
pArray = new int[iCount];
if (pArray)
{
while (iCount > 0)
{
pArray[iCount - 1] = 0;
}
}
else
{
WarnUser("无法分配内存");
}
}
这样写的话如果不调用Show函数的话可以编译通过,但一旦调用了Show函数就会出现以下错误:
无法解析的外部符号 "public: void __thiscall TIntArray::Show(int)" (?Show@TIntArray@@QAEXH@Z)
Maxwell 2008-04-22
  • 打赏
  • 举报
回复
整个类岂不是连类定义都在里面?Array.cpp之外有没有用这个类的?有没有#include "Array.cpp"的地方?
andsqllinux0915 2008-04-22
  • 打赏
  • 举报
回复
inline 分为显式和隐式的.
显式是只在声明的时候在返回类型前写上inline.在类外就可以直接写定义了.
隐式是在类中直接定义厕成.

类外定义附上属于类名就OK.
zhaoyu_me 2008-04-22
  • 打赏
  • 举报
回复
整个这个类就是写在array.cpp里
Maxwell 2008-04-22
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 zhaoyu_me 的回复:]
引用 19 楼 Maxwell 的回复:
整个类岂不是连类定义都在里面?Array.cpp之外有没有用这个类的?有没有#include "Array.cpp"的地方?


整个程序由一个main.cpp和一个array.cpp构成,在main.cpp中#include "Array.cpp"
[/Quote]

这就对了,array.cpp会被编译一次,编译main.cpp时又会编译一次,所以就出错了。
只要你把类定义写到array.h文件中,然后main.cpp中#include "Array.h"就可以了。

// Array.h

#ifndef ARRAY_H
#define ARRAY_H

class TIntArray
{
...
};

#endif


// Array.cpp
// 函数定义
昨夜无风 2008-04-22
  • 打赏
  • 举报
回复
分两个文件啥!

//IntArray.h
class TIntArray
{
public:
//缺省构造函数
TIntArray(int iCount = DefaultSize);
TIntArray(int *pOriginalArray,int iCount);
//拷贝构造函数
TIntArray(TIntArray &IntArray);

void Show(int iCount);

protected:
private:
const static int DefaultSize = 512;
int iCount;
int *pArray;
};

//IntArray.cpp

#include "IntArray.h"
void TIntArray::Show(int iCount)
{

}
//缺省构造函数
inline TIntArray::TIntArray(int iCount)
{
pArray = new int[iCount];
if (pArray)
{
while (iCount > 0)
{
pArray[iCount - 1] = 0;
}
}
else
{
WarnUser("无法分配内存");
}
}
加载更多回复(20)

64,646

社区成员

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

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