Инициализировать класс с конструктором внутри заголовка - PullRequest
0 голосов
/ 15 февраля 2011

У меня эта ошибка. Мой заголовок:

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 ]

2 голосов
/ 15 февраля 2011

Вы не можете сделать это в C ++.

Если вам нужен экземпляр libtorrent::fingerprint с именем a (ужасное имя), вам нужно объявить его как атрибут класса и инициализировать его в конструкторе. Вот пример:

class TorrentClass
{
public:
    TorrentClass()
        :a("LT", LIBTORRENT_VERSION_MAJOR, LIBTORRENT_VERSION_MINOR, 0, 0)
    {
    }

private:
    libtorrent::fingerprint a
};

error C2059: syntax error : 'string'

Это не имеет ничего общего с кодом, который вы опубликовали.

1 голос
/ 15 февраля 2011

В вашем .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», создайте его в качестве указателя и выделите его с новым:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...