【发布时间】:2011-02-12 17:33:52
【问题描述】:
我正在自学用 C++ 编写类,但似乎无法通过编译。如果您能帮助我弄清楚不仅是如何,而且是为什么,将不胜感激。先感谢您!这是我的三个文件:
make_pmt.C
#include <iostream>
#include "pmt.h"
using namespace std;
int main() {
CPMT *pmt = new CPMT;
pmt->SetVoltage(900);
pmt->SetGain(2e6);
double voltage = pmt->GetVoltage();
double gain= pmt->GetGain();
cout << "The voltage is " << voltage
<< " and the gain is " << gain << "." <<endl;
return 0;
}
pmt.C
#include "pmt.h"
using namespace std;
class CPMT {
double gain, voltage;
public:
double GetGain() {return gain;}
double GetVoltage() {return voltage;}
void SetGain(double g) {gain=g;}
void SetVoltage(double v) {voltage=v;}
};
pmt.h
#ifndef PMT_H
#define PMT_H 1
using namespace std;
class CPMT {
double gain, voltage;
public:
double GetGain();
double GetVoltage();
void SetGain(double g);
void SetVoltage(double v);
};
#endif
作为参考,我得到一个链接器错误(对吗?):
Undefined symbols:
"CPMT::GetVoltage()", referenced from:
_main in ccoYuMbH.o
"CPMT::GetGain()", referenced from:
_main in ccoYuMbH.o
"CPMT::SetVoltage(double)", referenced from:
_main in ccoYuMbH.o
"CPMT::SetGain(double)", referenced from:
_main in ccoYuMbH.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
【问题讨论】:
-
在标题中放置“使用”指令通常是一个坏主意,因为该指令会应用于包含标题的任何文件。在您的情况下,任何包含 pmt.h 的文件 - 甚至是间接的 - 都会将所有命名空间 std 拉入全局命名空间。
-
我同意加雷斯的观点。请参阅此处:stackoverflow.com/questions/2712076,了解为什么成为
using namespace std;(或任何其他人,就此而言,根本不是)是一个坏主意。
标签: c++ class split compilation