我在Qt项目中定义了我自己的类,这给了我一些问题,但我认为这可能是一般的C ++。
当我尝试在项目myHashMap中的任何包含文件中声明指向我的类的指针时
myHashMap* map;
编译器给出错误并说“map的多重定义”。这是什么?我甚至没有定义指针,只是声明了一个。
但是,将myHashMap* map
放在源文件中不会产生任何错误。
这是类定义和声明,抱歉它看起来有点乱。
#include QObject
#include QHash
class myHashMap : public QObject
{
Q_OBJECT
public:
explicit myHashMap(QObject *parent = 0);
float Get(const QString& key) const;
void setValue(const char key, float value)
{
// only emit value changed if the value has actually changed
//if( hash->value(key) != value)
//{
hash->insert(key,value);
//emit ValueChanged(key, value);
//}
}
signals:
public slots:
//void ValueChanged(const char& key, float newValue);
private:
QHash<const char, float>* hash;
};
myHashMap::myHashMap(QObject *parent) :
QObject(parent)
{
hash = new QHash<const char,float>;
}
编辑:
Aaa,无赖,我只是忘了使用extern关键字添加MyHashMap *。编程C ++是一个细节。如果编译器在这里发出警告就没有意义,例如“你好,你现在在几个标题中有多个定义,忘记了一个extern关键字?” ?
然而,我遇到了一个新问题。
在“communication.h”中,我已声明了这样的命名空间
namespace reference
{
extern const char potentiometer;
extern const char KpAngle;
extern const char KiAngle;
extern const char KdAngle;
extern const int length;
extern myHashMap* hmap;
void init();
}
在communication.cpp中,我想使用如下所示的* hmap,但编译器返回“对hmap的未定义引用”。然而,我在“communication.cpp”和* .pro文件中都包含了“communication.h”。请参阅以下代码:
#include "communication.h"
namespace reference
{
const char potentiometer = 0x05;
const char KpAngle = 0x06;
const char KiAngle = 0x07;
const char KdAngle = 0x08;
const int length =1;
//QList<const char>* summary = new QList<const char>();
void init()
{
//using namespace reference;
//#include "communication.h"
//myHashMap* hmap = new myHashMap();
//when using this a hmap is created, however setValue returns undefined ref
//Both methods below returns "undefine reference to hmap". Same if i try "using namespace"
//reference::hmap = new myHashMap();
//hmap = new myHashMap();
/*
reference::hmap->setValue(potentiometer,-1);
reference::hmap->setValue(KpAngle,-1);
reference::hmap->setValue(KiAngle,-1);
reference::hmap->setValue(KdAngle,-1);*/
}
}
编辑:在hmap的指针上方仅声明,未定义。因此,我通过添加
来定义hmapmyHashMap * hmap直接在“communication.cpp”的参考范围内。现在它有效。
答案 0 :(得分:0)
在头文件中使用extern
作为声明的前缀;即:
extern myHashMap* map;
您还需要将变量定义(不带extern
)放入某个源文件中。
导致问题的原因是头文件通常包含在多个源文件中。每个源文件都在其自己的翻译单元中编译,独立于所有其他文件。如果你在一个头文件中放入一个变量声明,那么你会得到多个翻译单元都试图定义同一个变量,从而导致冲突。
您想要的是变量仅存在于单个翻译单元中,因此声明在一个源文件中。 extern
版本只是表明存在(或将来)具有该名称和类型的变量,但实际上并不会导致它被创建。它实际上只是使任何看到它的东西都可见。
答案 1 :(得分:-1)
名称“map”可能已被您正在使用的库中的另一个变量或函数保留。如果您在主文件中包含的其他标头中包含标头,则可能会出现此错误。