指向类的指针存在问题
Problems with pointer to a class
我在一个Qt项目中定义了自己的类,这给我带来了问题,但我认为这可能是通用C++。
当我试图在项目myHashMap之类的中的任何包含文件中声明指向我的类的指针时
myHashMap* 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>;
}
编辑:
啊,我只是忘了在MyHashMap*前面加上extern关键字。编程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);*/
}
}
EDIT:指向hmap的指针仅在上面声明,而不是定义。因此,我必须通过放置来定义hmap
myHashMap*hmap直接在"communication.cpp"中的引用范围中。现在它可以工作了。
在头文件中用extern
作为声明的前缀;即:
extern myHashMap* map;
您还需要将变量定义(不带extern
)放入某个源文件中。
这导致问题的原因是头文件通常包含在多个源文件中。每个源文件都是在自己的翻译单元中编译的,与其他所有源文件无关。如果在头文件中放入一个变量声明,那么会有多个翻译单元试图定义同一个变量,从而导致冲突。
您想要的是变量只存在于一个翻译单元中,因此声明在一个源文件中。extern
版本只是表示存在(或将存在)具有该名称和类型的变量,但实际上并没有导致创建该变量。它实际上只是让任何看到它的人都能看到它。
名称"map"很可能已被您正在使用的库中的另一个变量或函数保留。此外,如果您在主文件中包含的其他标头中包含标头,则可能会出现此错误。
- C++Builder中的OnClick事件签名存在问题
- 在 C++ 中使用逗号的 echo 命令中存在问题
- Malloc 在使用线程并行化 SSH 调用时存在问题
- 构造函数 (C++) 中的 char 指针参数存在问题
- 在 boost::variant 中类 holden 的复制构造函数存在问题
- 用户定义的文本运算符(在原始模式下)存在问题
- C++中的数组存在问题
- C++中的正则表达式存在问题
- 英特尔 DAAL 头文件可能存在问题
- 错误:"参数"没有命名类型,.cpp和 .h 文件可能存在问题
- 我的 IF 语句中存在问题,否则无法正常工作
- 在 c++ 中具有多个参数构造函数的模板类存在问题
- template_back和move赋值构造函数存在问题
- CMake 3.13.2 似乎在 G++ 8.2.0 中存在问题
- 使用Boost的班级名称冲突是否存在问题
- CMAKE:目标依赖项存在问题(add_dependency不起作用?
- C SQLITE3代码似乎在准备声明方面存在问题
- 此UUID生成代码是否存在问题
- 派生类中的模板存在问题
- 从多线程.net应用程序调用的本机dll中的tbb存在问题