在头文件中使用构造函数初始化一个类

时间:2011-02-15 05:20:38

标签: c++ class compiler-errors

我有这个错误。 我的标题:

libtorrent::fingerprint a("LT", LIBTORRENT_VERSION_MAJOR, LIBTORRENT_VERSION_MINOR, 0, 0);
class TorrentClass
{
}

编译器抱怨libtorrent :: fingerprint已在另一个类中定义,因为它已被包含在内。所以我把它移到我的班级里面

    class TorrentClass
    {
           private:
           libtorrent::fingerprint a("LT", LIBTORRENT_VERSION_MAJOR, LIBTORRENT_VERSION_MINOR, 0, 0);
    }

然后我的编译器在移动的行上得到了非常奇怪的错误,比如

error C2059: syntax error : 'string'

我做错了什么?

2 个答案:

答案 0 :(得分:2)

你不能用C ++做到这一点。

如果你想要一个名为libtorrent::fingerprint的{​​{1}}实例(可怕名称),那么你需要将它声明为该类的属性并在构造函数中初始化它。这是一个例子:

a
  

class TorrentClass { public: TorrentClass() :a("LT", LIBTORRENT_VERSION_MAJOR, LIBTORRENT_VERSION_MINOR, 0, 0) { } private: libtorrent::fingerprint a };

这与您发布的代码无关。

答案 1 :(得分:1)

在你的.h文件中。声明:

#ifndef CLASS_TORRENT_H
#define CLASS_TORRENT_H
#include "libtorrent.h" // I'm guessing this is the header file that declares the "fingerprint" class
extern libtorrent::fingerprint a;
class TorrentClass
{
public:
   TorrentClass();
   // your class declaration goes here
};

#endif

在.cpp(.cc)文件中。定义对象:

#include "ClassTorrent.h" // the header file described above
libtorrent::fingerprint a("LT", LIBTORRENT_VERSION_MAJOR, LIBTORRENT_VERSION_MINOR, 0, 0);
TorrentClass::TorrentClass()
{
  // your constructor code goes here.
}

此外,在我的团队中,我们明确禁止“全局对象”,例如您声明的“a”实例。原因是构造函数在“main”之前运行(与所有其他全局对象以非确定性顺序运行)。并且它的析构函数在主要退出之后才会运行。

如果你确实需要“a”为全局,请将其实例化为指针并用new分配:

libtorrent::fingerprint *g_pFingerPrintA;
int main()
{
    g_pFingerPrintA = new libtorrent::fingerprint("LT", LIBTORRENT_VERSION_MAJOR, LIBTORRENT_VERSION_MINOR, 0, 0);

    // program code goes here

    // shutdown
    delete g_pFingerPrintA;
}