指向类的指针的问题

时间:2013-12-07 16:59:28

标签: c++ qt pointers

我在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的指针上方仅声明,未定义。因此,我通过添加

来定义hmap

myHashMap * hmap直接在“communication.cpp”的参考范围内。现在它有效。

2 个答案:

答案 0 :(得分:0)

在头文件中使用extern作为声明的前缀;即:

extern myHashMap* map;

您还需要将变量定义(不带extern)放入某个源文件中。

导致问题的原因是头文件通常包含在多个源文件中。每个源文件都在其自己的翻译单元中编译,独立于所有其他文件。如果你在一个头文件中放入一个变量声明,那么你会得到多个翻译单元都试图定义同一个变量,从而导致冲突。

您想要的是变量仅存在于单个翻译单元中,因此声明在一个源文件中。 extern版本只是表明存在(或将来)具有该名称和类型的变量,但实际上并不会导致它被创建。它实际上只是使任何看到它的东西都可见。

答案 1 :(得分:-1)

名称“map”可能已被您正在使用的库中的另一个变量或函数保留。如果您在主文件中包含的其他标头中包含标头,则可能会出现此错误。