类外的成员函数定义

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.hshow() 可以移动到定义 main() 的位置,使 acc.h/acc.cpp 文件专用于 mem 类。 头文件应始终以其所持有的类命名,即在您的情况下为mem.h/mem.cpp。即使不打开文件,它也会通知哪个文件包含哪个类。

【讨论】:

很遗憾,您的第一个解决方案在 Codeblocks 17.01 版本的 IDE 中不起作用。

以上是关于类外的成员函数定义的主要内容,如果未能解决你的问题,请参考以下文章

作为类成员的函数的定义

C++ 类 - 使用公共变量并在类外定义成员函数

C++模板类中的成员函数以及模板函数在类外定义的方式

友元函数

C++中static函数类外定义的时候为啥不写static?

inline&friend&操作符重载