crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Проблема со статическим объектом
ruzik
  опции профиля:
сообщение 10.10.2011, 22:38
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 254
Регистрация: 23.2.2011
Из: Саратов
Пользователь №: 2436

Спасибо сказали: 2 раз(а)




Репутация:   0  


Здравствуйте, есть код:
Geter.h
#ifndef GETER_H
#define GETER_H

#include "rizekmath.h"

class Geter {
public:
    Geter();
    ~Geter();

    static void setRizekMath(RizekMath * rm) { gPRizekMath = rm;}
    static RizekMath * getRizekMath() { return gPRizekMath;}
private:
    static RizekMath * gPRizekMath;
};
#endif

Geter.cpp
#include "Geter.h"

Geter::Geter()
{

}
Geter::~Geter()
{

}

И на него выдает ошибки:

Ошибка 1 error LNK2001: неразрешенный внешний символ ""private: static class RizekMath * Geter::gPRizekMath" (?gPRizekMath@Geter@@0PAVRizekMath@@A)" rizekmath.obj
Ошибка 2 fatal error LNK1120: 1 неразрешенных внешних элементов C:\Users\ruzik\Documents\Visual Studio 2008\Projects\RizekMath\Debug\RizekMath.exe

Если сделать так:
static class Geter {
public:
    Geter();
    ~Geter();

    void setRizekMath(RizekMath * rm) { gPRizekMath = rm;}
    RizekMath * getRizekMath() { return gPRizekMath;}
private:
    RizekMath * gPRizekMath;

То ошибок нет, хотя все тоже самое должно быть по-смыслу, + выскакивают эти предупреждения

Предупреждение 1 warning C4091: static : пропускается слева от 'Geter', когда ни одна переменная не объявлена c:\users\ruzik\documents\visual studio 2008\projects\rizekmath\rizekmath\geter\Geter.h 15
Но статика не срабатывает в этом случае!
Подскажите что не так и в чем разница
Заранее спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
ruzik
  опции профиля:
сообщение 12.10.2011, 20:48
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 254
Регистрация: 23.2.2011
Из: Саратов
Пользователь №: 2436

Спасибо сказали: 2 раз(а)




Репутация:   0  


Проект достаточно, большой и выкладывать его всего не вижу смысла, приложил сам класс который и рассматривается(Geter)

Я нашел загвоздку, если обозначить все члены как статичные все ок, но если обозначить класс как статичный то все ок
P.S. я всегда думал что если обозначить класс статичным, то просто все его элементы будут статичными, но видимо я ошибался

Как ни странно википедия говорит о том же
http://ru.wikipedia.org/wiki/%D0%A1%D1%82%...%B0%D1%81%D1%81

Хотя если сделать как я то ничего вообще не работает, то есть ошибок не выдает, но и объекты не статичные
Вот полный код того что я имею:
Geter.h
#ifndef GETER_H
#define GETER_H

#include "rizekmath.h"

class Geter {
public:
    Geter();
    ~Geter();

    static void setRizekMath(RizekMath * rm) { gPRizekMath = rm;}
    static RizekMath * getRizekMath() { return gPRizekMath;}
private:
    static RizekMath * gPRizekMath;
};
#endif

Geter.cpp
#include "Geter.h"
RizekMath * Geter::gPRizekMath=0; //<<<

Geter::Geter()
{

}
Geter::~Geter()
{

}

И например так проверяем это дело
    Geter geter;
    geter.setRizekMath(this);
    Geter g1;
    this->setObjectName("QWERTY");
    qDebug() << geter.getRizekMath()->objectName();
    qDebug() << g1.getRizekMath()->objectName();


А нет все работает, это я не заметил когда выводило
Алексей1153, еще раз большое спасибо вам за помощь!
P.S. надеюсь вы не успели прочитать мой бессмысленный монолог и потратить свое время на решение мнимой проблемы))
Прикрепленные файлы
Прикрепленный файл  Geter.zip ( 677 байт ) Кол-во скачиваний: 101
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.11.2024, 0:45