【问题标题】: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开始

标签: c++ function class header


【解决方案1】:

如果您从acc.h 文件中删除#include "acc.cpp",它应该可以编译而不会出现任何错误。我试过了,它为我编译。我正在使用 Visual Studio 2010。

除此之外,还有几个 cmets:

  1. 您可以在头文件中使用#pragma once,而不是#ifndef/#define 宏。前者更干净。
  2. 您不需要在main() 之前转发声明class mem,因为您已经包含acc.h
  3. show() 可以移动到定义 main() 的位置,使 acc.h/acc.cpp 文件专用于 mem 类。
  4. 头文件应始终以其所持有的类命名,即在您的情况下为mem.h/mem.cpp。即使不打开文件,它也会通知哪个文件包含哪个类。

【讨论】:

  • 很遗憾,您的第一个解决方案在 Codeblocks 17.01 版本的 IDE 中不起作用。
猜你喜欢
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-20
  • 2015-05-01
相关资源
最近更新 更多