Необъявленный идентификатор С++ (но он объявлен?)

Я почти уверен, что включил класс qanda, но когда я пытаюсь объявить вектор, содержащий его, или класс этого типа, я получаю сообщение об ошибке, говорящее, что qanda не определен. Есть идеи, в чем может быть проблема?

bot_manager_item.h

#pragma once

#include "../bot_packet/bot_packet.h"
#include <vector>

class bot_manager_item;
#include "qanda.h"
#include "bot_manager.h"

class bot_manager_item
{
public:
    bot_manager_item(bot_manager* mngr, const char* name, const char* work_dir);
    ~bot_manager_item();

    bool startup();
    void cleanup();
    void on_push_event(bot_exchange_format f);
    bool disable;

private:
    void apply_changes();
    bot_manager *_mngr;

    std::string _name;
    std::string _work_dir;
    std::string _message;
    std::string _message_copy;
    std::vector<qanda> games;
    qanda test;

    char _config_full_path[2600];
};

канда.ч

#ifndef Q_AND_A
#define Q_AND_A

#include "users.h"
#include "..\bot_packet\bot_packet.h"
#include "bot_manager.h"
#include <string>
#include <algorithm>
#include <map>
#include <vector>
#include <fstream>


class qanda
{
public:
    qanda(bot_manager * manager, std::string name, std::string directory);
    ~qanda(){};
    void room_message(std::string username, std::string user_message);
    void timer_tick();

private:
    // data members
    std::string question;
    std::string answer;
    std::string directory;
    std::string command_prefix;
    std::string name;

    Users users;
    std::map <std::string, std::string> questions_and_answers;

    int time_per_question; // seconds
    int time_between_questions; // seconds
    int timer; // milliseconds

    bool is_delayed;
    bool is_playing;

    bot_manager * manager;

    // functions
    void new_question();
    void send_message(std::string msg);
    void announce_question();
    void load_questions();

};

#endif

Решено: я закончил рефакторинг кода таким образом, чтобы избежать использования bot_manager в классе qanda.


person Joshua    schedule 24.12.2010    source источник
comment
Можете ли вы опубликовать фактическое сообщение об ошибке?   -  person cristobalito    schedule 24.12.2010
comment
В основном это было: Intellisense: необъявленный идентификатор qanda.   -  person Joshua    schedule 24.12.2010
comment
Сейчас работаю над устранением других ошибок.   -  person Joshua    schedule 24.12.2010


Ответы (1)


Я подозреваю круговую проблему #include. Возможно ли, что qanda.h косвенно включает bot_manager_item.h?

Похоже, вы можете уменьшить зависимости заголовков, используя предварительное объявление

class bot_manager;

вместо #include "bot_manager.h" в одном или обоих ваших опубликованных файлах заголовков.

person aschepler    schedule 24.12.2010
comment
bot_manager включает bot_manager_item. Это может вызвать это? - person Joshua; 24.12.2010
comment
Это позволило мне пройти стадию строительства. Теперь у меня не получается связать, тьфу. Куча вещей о том, что у меня есть неразрешенные внешние символы. Сейчас буду читать, что это может означать. - person Joshua; 24.12.2010
comment
Не берите в голову. Я очистил решение и попытался снова обнаружить, что я все еще застрял на этапе сборки. Я не уверен, как работают предварительные объявления, и когда я использовал то, что вы написали, мне сказали, что bot_manager не определен. - person Joshua; 24.12.2010
comment
@Josh - это ошибка в блоке перевода, который реализует bot_manager, или в клиентском коде, который использует bot_manager? Имейте в виду, что все предварительное объявление сообщает компилятору, что ваш класс существует. Если у вас есть код, который на самом деле ссылается на методы или члены данных этого класса, он должен быть полностью определен. В этом случае в модуле компиляции потребуется #include bot_manager.h. - person greatwolf; 25.12.2010