类外的成员函数定义
Posted
技术标签:
【中文标题】类外的成员函数定义【英文标题】:Member function definition outside the class 【发布时间】:2018-06-02 12:30:27 【问题描述】:首先,我给出代码。然后我解释我面临的问题。
main.cpp
#include <iostream>
#include "acc.h"
using namespace std;
class mem;
int main()
show();
return 0;
acc.h
#ifndef ACC_H
#define ACC_H
#include "acc.cpp"
void show();
class mem
int a;
public:
void showa();
void seta(int A);
;
#endif
acc.cpp
#include <iostream>
using namespace std;
void mem::showa()cout<<a<<endl;
void mem::seta(int A)a = A;
void show()
mem m;
m.seta(22);
string ss;
cin>>ss;
cout<<"MY name is "<<ss<<" ";
m.showa();
我已经在“acc.h”文件中声明的“mem”类并将“acc.h”也添加到了acc.cpp文件中。但是当我从一个函数调用那个类时。它无法响应。显示未声明的“a”和“mem”。我如何才能完美地链接该类的定义和该类的成员函数,以便从另一个函数调用该类的成员函数不会产生任何问题?
【问题讨论】:
为什么要在 acc.h 中放置#include "acc.cpp"?我认为没有必要。 是的,你是对的。我只是尝试了“反复试验”的方法,这就是它存在的原因。我正在纠正它。谢谢。 С++ 是有据可查的语言,无需“反复试验”acc.cpp
也应该是#include 'acc.h'
试错不是好的学习方法,应该从a good book开始
【参考方案1】:
如果您从acc.h
文件中删除#include "acc.cpp"
,它应该可以编译而不会出现任何错误。我试过了,它为我编译。我正在使用 Visual Studio 2010。
除此之外,还有几个 cmets:
-
您可以在头文件中使用
#pragma once
,而不是#ifndef/#define
宏。前者更干净。
您不需要在main()
之前转发声明class mem
,因为您已经包含acc.h
。
show()
可以移动到定义 main()
的位置,使 acc.h/acc.cpp
文件专用于 mem
类。
头文件应始终以其所持有的类命名,即在您的情况下为mem.h/mem.cpp
。即使不打开文件,它也会通知哪个文件包含哪个类。
【讨论】:
很遗憾,您的第一个解决方案在 Codeblocks 17.01 版本的 IDE 中不起作用。以上是关于类外的成员函数定义的主要内容,如果未能解决你的问题,请参考以下文章