Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2009, 08:16   #1
ZeBriD
Новичок
Джуниор
 
Регистрация: 23.09.2009
Сообщений: 4
По умолчанию Cоздание объекта класса из API одного сервиса. Ошибки =(

День или вечер добрый.
Скачал API одного сервиса. При попытке создать объект одного из API классов , получаю несколько ошибок:
Цитата:
tmp/mainwindow.o: In function `UserStoreClient':
/path_to_project/api/UserStore.h:593: undefined reference to `vtable for evernote::edam::UserStoreClient'
/path_to_project/api/UserStore.h:593: undefined reference to `vtable for evernote::edam::UserStoreClient'
tmp/mainwindow.o: In function `~UserStoreClient':
/path_to_project/api/UserStore.h:589: undefined reference to `vtable for evernote::edam::UserStoreClient'
/path_to_project/api/UserStore.h:589: undefined reference to `vtable for evernote::edam::UserStoreClient'
collect2: ld returned 1 exit status
Объявляю переменную следущим образом:
Код:
UserStoreClient userStore = UserStoreClient(userStoreProtocol);
где переменная userStoreProtocol соответственно заранее определена.
Посмотрел код класса - в нём нет виртуальных функций, которые надо было бы определить....

Собственно, сам класс UserStoreClient объявлен следущим образом:
Код:
class UserStoreIf {
 public:
  virtual ~UserStoreIf() {}
  virtual bool checkVersion(const std::string& clientName, const int16_t edamVersionMajor, const int16_t edamVersionMinor) = 0;
  virtual void authenticate(AuthenticationResult& _return, const std::string& username, const std::string& password, 
        const std::string& consumerKey, const std::string& consumerSecret) = 0;
  virtual void refreshAuthentication(AuthenticationResult& _return, const std::string& authenticationToken) = 0;
  virtual void getUser(evernote::edam::User& _return, const std::string& authenticationToken) = 0;
  virtual void getPublicUserInfo(PublicUserInfo& _return, const std::string& username) = 0;
};


class UserStoreClient : virtual public UserStoreIf {
 public:
  UserStoreClient(boost::shared_ptr<apache::thrift::protocol::TProtocol> prot) :
    piprot_(prot),
    poprot_(prot) {
    iprot_ = prot.get();
    oprot_ = prot.get();
  }
  UserStoreClient(boost::shared_ptr<apache::thrift::protocol::TProtocol> iprot, boost::shared_ptr<apache::thrift::protocol::TProtocol> oprot) :
    piprot_(iprot),
    poprot_(oprot) {
    iprot_ = iprot.get();
    oprot_ = oprot.get();
  }
  boost::shared_ptr<apache::thrift::protocol::TProtocol> getInputProtocol() {
    return piprot_;
  }
  boost::shared_ptr<apache::thrift::protocol::TProtocol> getOutputProtocol() {
    return poprot_;
  }
  bool checkVersion(const std::string& clientName, const int16_t edamVersionMajor, const int16_t edamVersionMinor);
  void send_checkVersion(const std::string& clientName, const int16_t edamVersionMajor, const int16_t edamVersionMinor);
  bool recv_checkVersion();
  void authenticate(AuthenticationResult& _return, const std::string& username, const std::string& password, 
        const std::string& consumerKey, const std::string& consumerSecret);
  void send_authenticate(const std::string& username, const std::string& password, const std::string& consumerKey, const std::string& consumerSecret);
  void recv_authenticate(AuthenticationResult& _return);
  void refreshAuthentication(AuthenticationResult& _return, const std::string& authenticationToken);
  void send_refreshAuthentication(const std::string& authenticationToken);
  void recv_refreshAuthentication(AuthenticationResult& _return);
  void getUser(evernote::edam::User& _return, const std::string& authenticationToken);
  void send_getUser(const std::string& authenticationToken);
  void recv_getUser(evernote::edam::User& _return);
  void getPublicUserInfo(PublicUserInfo& _return, const std::string& username);
  void send_getPublicUserInfo(const std::string& username);
  void recv_getPublicUserInfo(PublicUserInfo& _return);
 protected:
  boost::shared_ptr<apache::thrift::protocol::TProtocol> piprot_;
  boost::shared_ptr<apache::thrift::protocol::TProtocol> poprot_;
  apache::thrift::protocol::TProtocol* iprot_;
  apache::thrift::protocol::TProtocol* oprot_;
};

Подскажите, как таки избавиться от этих ошибок ?

Последний раз редактировалось ZeBriD; 23.09.2009 в 08:18.
ZeBriD вне форума Ответить с цитированием
Старый 23.09.2009, 09:55   #2
HWork
Пользователь
 
Регистрация: 27.07.2009
Сообщений: 27
По умолчанию

Обычно это происходит, если какой-то виртуальный метод класса объявлен, но нигде не определён.
HWork вне форума Ответить с цитированием
Старый 23.09.2009, 10:03   #3
ZeBriD
Новичок
Джуниор
 
Регистрация: 23.09.2009
Сообщений: 4
По умолчанию

Цитата:
Сообщение от HWork Посмотреть сообщение
Обычно это происходит, если какой-то виртуальный метод класса объявлен, но нигде не определён.
Это я прекрасно понимаю. Для того и привёл весь листинг класса и класса предка. В самом классе - вообще нет вирт. методов. В классе-предке - есть, но все они определены в конечном классе.
ZeBriD вне форума Ответить с цитированием
Старый 23.09.2009, 10:07   #4
HWork
Пользователь
 
Регистрация: 27.07.2009
Сообщений: 27
По умолчанию

Если ты не реализовал эти функции, компилятор будет выдавать ошибку.

попробуй в классе UserStoreClient дописать к следующим функциям {...} и проверь исчезнет ли ошибка (и соответсвенно реализуй остальные функции):

bool checkVersion("список параметров"){return true;}
void authenticate("список параметров"){}
void refreshAuthentication("список параметров"){}
void getUser("список параметров"){}
void getPublicUserInfo("список параметров"){}
HWork вне форума Ответить с цитированием
Старый 23.09.2009, 10:23   #5
ZeBriD
Новичок
Джуниор
 
Регистрация: 23.09.2009
Сообщений: 4
По умолчанию

Все эти функции определены в соответствующем *.cpp файле.
Но, чем чёрт не шутит... Всё равно прописал пустые тела после объявления функций. Не помогло.
ZeBriD вне форума Ответить с цитированием
Старый 23.09.2009, 11:03   #6
HWork
Пользователь
 
Регистрация: 27.07.2009
Сообщений: 27
По умолчанию

"undefined reference to `vtable for evernote::edam::UserStoreClient'"

Компилятор пишет "неопределенная ссылка на 'v-таблицу evernote::edam::UserStoreClient' ''

Можешь написать строки в которых компилятор указал ошибки.
HWork вне форума Ответить с цитированием
Старый 23.09.2009, 11:10   #7
ZeBriD
Новичок
Джуниор
 
Регистрация: 23.09.2009
Сообщений: 4
По умолчанию

Собственно, долго копаясь дошёл вот до чего:
Закоментил всё нафиг. Оставил только конструктор и определение вирт.методов предка с пустыми телами. Собралось без проблем.
Начал раскоменчивать. Ошибка появляется когда у какого-либо из определённых методов убрать пустое тело.
Соответственно, реализация имеется в соответствующем срр файле.
ZeBriD вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перекрытие одного объекта другим Djem1991 Общие вопросы Delphi 3 11.06.2009 13:17
COM-объекты в MS Script Control. Присвоение метода одного объекта другому объекту. Антон Ю.Б. Общие вопросы Delphi 1 04.04.2009 13:41
Присваивание объекту родительского класса объекта дочернего Викдон Общие вопросы Delphi 0 07.02.2009 15:27
С помощью методов и свойств объекта осуществляется управление терминалом. Имя (идентификатор) объекта User>lia Общие вопросы Delphi 4 16.01.2009 16:37