如何实现.h文件c ++中定义的类

时间:2012-12-22 17:15:38

标签: c++ build header-files

好吧,我来自Java和Python,所以请耐心等待一下。我一直在互联网上寻找学习如何在c ++中使用头文件,我一直没事,直到我被绑定来定义一个类。这是我的代码。

notAClock.h

#ifndef NOTACLOCK_H_
#define NOTACLOCK_H_

namespace thenewboston {

class notAClock {
public:
    notAClock();
    virtual ~notAClock();
    int isAClock();
};

} /* namespace thenewboston */
#endif /* NOTACLOCK_H_ */

notAClock.cpp

    /*
 * notAClock.cpp
 *
 *  Created on: Dec 22, 2012
 *      Author: pipsqueaker
 */

#include "notAClock.h"

namespace thenewboston {

notAClock::notAClock() {
    // TODO Auto-generated constructor stub

}

notAClock::~notAClock() {
    // TODO Auto-generated destructor stub
}

int notAClock::isAClock() {
    return 0;
}
} /* namespace thenewboston */

,最后,我的主文件

#include <iostream>
#include "notAClock.h"
using namespace std;

int main() {
    cout << "program works" << endl;
    notAClock play;
}

当Eclipse尝试为我编译时(我正在使用CDT插件)它会抛出一个错误,相关部分是

../src/main.cpp:13: error: 'notAClock' was not declared in this scope
../src/main.cpp:13: error: expected `;' before 'play'
make: *** [src/main.o] Error 1

我能解决的最多是在主类中未定义notAClock。我做错了什么?

-pipsqueaker117

2 个答案:

答案 0 :(得分:4)

您拥有命名空间内的类。它需要有资格使用它:

thenewboston::notAClock play;

或者添加using指令以允许对该类进行非限定访问:

using thenewboston::notAClock;
notAClock play;

或者using namespace指令来引入整个命名空间:

using namespace std;
using namespace thenewboston;

int main() {
    cout << "program works" << endl;
    notAClock play;
}

答案 1 :(得分:0)

要解决“如何在c ++中使用头文件”问题的一部分,请注意以下几点:

1)C ++中的头文件与java或python中的包导入不同:当你在C ++中使用#include时,文件的文本在编译期间被包含在源文件中(忽略预编译的头文件,这是一个优化),以及与正在编译的文件一起编译的内容。这意味着整个项目中经常出现的任何头文件#incound都会被反复编译。这就是为什么在C ++中将#includes保持在绝对最小值的原因之一。

2)在样式方面,许多人更喜欢在公共头文件中保留公共接口类声明(例如,参见“pimpl”习语),并将具体的类定义放入.cpp文件中。这使类的实现的内部细节与其公共接口在物理上分离。当类的实现发生更改时,只需要重新编译具有实现代码的文件。如果将类的实现放在广泛的头文件中,那么不仅在开发过程中会产生更多更长的构建,而且非相关代码更可能“混乱”类的实现并导致难以实现-debug问题。