指向类的指针存在问题

Problems with pointer to a class

本文关键字:存在 问题 指针      更新时间:2023-10-16

我在一个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"很可能已被您正在使用的库中的另一个变量或函数保留。此外,如果您在主文件中包含的其他标头中包含标头,则可能会出现此错误。