Russian Qt Forum
Май 29, 2024, 12:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Непонятная ошибка undefined reference to  (Прочитано 29671 раз)
Alex_C
Гость
« : Май 27, 2012, 13:04 »

Делаю сингл-паттерн:

Код:
#ifndef FLAGOBJECT_H
#define FLAGOBJECT_H

#include <QByteArray>
#include <QMap>
#include <QString>
#include <QVector>

class QImage;
class QColor;

class FlagObject
{
public:
    static FlagObject *instance;
    static FlagObject* getInstance()
    {
        if(!instance)
            instance = new FlagObject();
        return instance;
    }
    ~FlagObject();
    void getFlag(int flagNum, QImage &image);

private:
    FlagObject();
    bool openDatFile(QString fileName);

    int m_FlagCount;
    QVector<QColor> *m_FlagBuffer;
    QMap<int, QString> *m_ColorMap;

    void init_ColorMap()
    {
        m_ColorMap = new QMap<int, QString>;
        m_ColorMap->insert(0, "black");
        m_ColorMap->insert(1, "darkRed");
        m_ColorMap->insert(2, "darkGreen");
        m_ColorMap->insert(3, "darkYellow");
        m_ColorMap->insert(4, "darkBlue");
        m_ColorMap->insert(5, "darkMagenta");
        m_ColorMap->insert(6, "darkCyal");
        m_ColorMap->insert(7, "darkGray");
        m_ColorMap->insert(8, "lightGray");
        m_ColorMap->insert(9, "red");
        m_ColorMap->insert(10, "green");
        m_ColorMap->insert(11, "yellow");
        m_ColorMap->insert(12, "blue");
        m_ColorMap->insert(13, "magenta");
        m_ColorMap->insert(14, "cyan");
        m_ColorMap->insert(15, "white");
    }
};

#endif // FLAGOBJECT_H

Компилю - без ошибок.

Пытаюсь его использовать -

Код:
#include "flagviewdelegate.h"
#include "flagobject.h"

FlagViewDelegate::FlagViewDelegate(QObject *parent) :
    QItemDelegate(parent)
{
}

void FlagViewDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                             const QModelIndex &index) const
{
    FlagObject *flagObject = FlagObject::getInstance();
}

Получаю ошибку:

./Obj\release\flagviewdelegate.o:flagviewdelegate.cpp:(.text+0x8): undefined reference to `FlagObject::instance'

Понимаю, что где-то что-то не так указал. Но у меня уже 2 аналогичных паттерна в программе есть - без проблем работают. А тут почему ошибка вылазиет?
Записан
Serr500
Гость
« Ответ #1 : Май 27, 2012, 13:20 »

В cpp-файле надо написать:
Код:
FlagObject *FlagObject::instance = NULL;
Записан
Alex_C
Гость
« Ответ #2 : Май 27, 2012, 13:34 »

Это понятно, что нулем нужно инициировать. Ошибка то от этого не исчезнет.
Записан
V1KT0P
Гость
« Ответ #3 : Май 27, 2012, 13:48 »

Это понятно, что нулем нужно инициировать. Ошибка то от этого не исчезнет.
Исчезнет. Добавь как тебе сказали строку в cpp-файл. Или выложи минимальный проект.
Записан
Alex_C
Гость
« Ответ #4 : Май 27, 2012, 14:39 »

Дело в том, что не могу я добавить эту строку. Появляется описанная ошибка при попытке обращения instance.

Вот прилагаю вообще пустой проект, где возникает эта ошибка.
У меня ошибка возникает здесь:

Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "testsingle.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    TestSingle *t = TestSingle::getInstance(); // Ошибка в этой строке.
}

MainWindow::~MainWindow()
{
    delete ui;
}
Записан
V1KT0P
Гость
« Ответ #5 : Май 27, 2012, 14:46 »

Дело в том, что не могу я добавить эту строку. Появляется описанная ошибка при попытке обращения instance.
Ну так добавь, я вот добавил и все компилится.
Записан
Alex_C
Гость
« Ответ #6 : Май 27, 2012, 14:56 »

Тьфу БЛИИИИИИИИИИИИИИИИИИИИН!
Все, на сегодня программировать хватит! Это ж надо так тупить!
Спасибо большое - Serr500 & V1KT0P - у меня ж у 2-х других паттернов аналогичных все работает, потому как эта строка присутствует.
Записан
andrew.k
Гость
« Ответ #7 : Май 27, 2012, 17:50 »

А разве instance не должен быть приватным?

Код
C++ (Qt)
public:
   static FlagObject *instance;
Записан
Alex_C
Гость
« Ответ #8 : Май 28, 2012, 00:52 »

Нет конечно. Это один из самых простых и "правильных"паттернов))
Записан
alexis031182
Гость
« Ответ #9 : Май 28, 2012, 07:36 »

А где удаляется созданный инстанс FlagObject'а?
Записан
sidsukana
Гость
« Ответ #10 : Май 28, 2012, 09:05 »

Перед описанием класса добавьте

Код:
class FlagObject;

Нужно предопределить класс, если хотите сразу же его использовать.
« Последнее редактирование: Май 28, 2012, 09:07 от sidsukana » Записан
andrew.k
Гость
« Ответ #11 : Май 28, 2012, 09:33 »

Нет конечно. Это один из самых простых и "правильных"паттернов))
Если оставить его публичным смысла в функции getInstance становится ровно 0.04 и такой класс перестает быть синглтоном.
А становится непонятно чем.
Записан
andrew.k
Гость
« Ответ #12 : Май 28, 2012, 09:35 »

Перед описанием класса добавьте

Код:
class FlagObject;

Нужно предопределить класс, если хотите сразу же его использовать.
Это вроде лишнее. Он же используется внутри самого класса.
А внутри класса класс сам себе известен  Смеющийся
Записан
Alex_C
Гость
« Ответ #13 : Май 28, 2012, 19:13 »

А где удаляется созданный инстанс FlagObject'а?

Удаляется так:

delete FlagObject::instance;

в "основном" классе)))

Записан
Alex_C
Гость
« Ответ #14 : Май 28, 2012, 19:15 »

Если оставить его публичным смысла в функции getInstance

Удалять как тогда? Кстати идея то совсем не моя - в инете есть весьма хорошая статья по поводу использования сингл-паттерна.
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.067 секунд. Запросов: 17.