2

好吧,我来自 Java 和 Python,所以请耐心等待。我一直在互联网上四处寻找,试图学习如何在 C++ 中使用头文件,在我定义一个类之前我做得很好。这是我的代码。

notALock.h

#ifndef NOTACLOCK_H_
#define NOTACLOCK_H_

namespace thenewboston {

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

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

notALock.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

4

2 回答 2

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;
}
于 2012-12-22T17:17:51.157 回答
0

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

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

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

于 2012-12-22T18:50:16.620 回答