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
Но статика не срабатывает в этом случае!
Подскажите что не так и в чем разница
Заранее спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 11.10.2011, 9:02
Сообщение #2


фрилансер
******

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

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




Репутация:   34  


нужно добавить следующее:

Geter.cpp

#include "Geter.h"

RizekMath * Geter::gPRizekMath=0; //<<<


Geter::Geter()
{

}
Geter::~Geter()
{

}


Цитата
Подскажите что не так и в чем разница

разница в том, что это статический член класса


Вопрос - не по Qt, а по C/C++

Сообщение отредактировал Алексей1153 - 11.10.2011, 9:07
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ruzik
  опции профиля:
сообщение 11.10.2011, 17:17
Сообщение #3


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

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

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




Репутация:   0  


Спасибо за помощь!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 11.10.2011, 18:46
Сообщение #4


фрилансер
******

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

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




Репутация:   34  


ruzik, тогда я не уточнил, это называется инстанцировать (от instance)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ruzik
  опции профиля:
сообщение 11.10.2011, 19:33
Сообщение #5


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

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

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




Репутация:   0  


Стойте, попробовал то что вы мне предложили, и получил это:

Предупреждение 1 warning C4091: static : пропускается слева от 'Geter', когда ни одна переменная не объявлена c:\users\ruzik\documents\visual studio 2008\projects\rizekmath\rizekmath\geter\Geter.h 15
Ошибка 2 error C2761: RizekMath *Geter::gPRizekMath: повторное объявление функции не разрешается c:\Users\ruzik\Documents\Visual Studio 2008\Projects\RizekMath\RizekMath\Geter\Geter.cpp 3
Ошибка 3 fatal error C1903: не удается восстановить после предыдущих ошибок; остановка компиляции c:\Users\ruzik\Documents\Visual Studio 2008\Projects\RizekMath\RizekMath\Geter\Geter.cpp 3

Ничего другого не добовлял, только в cpp
RizekMath * Geter::gPRizekMath=0; //<<<
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 12.10.2011, 8:18
Сообщение #6


фрилансер
******

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

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




Репутация:   34  


ruzik, приложи проект
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ruzik
  опции профиля:
сообщение 12.10.2011, 20:48
Сообщение #7


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

Группа: Участник
Сообщений: 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 байт ) Кол-во скачиваний: 102
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 13.10.2011, 11:24
Сообщение #8


фрилансер
******

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

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




Репутация:   34  


ruzik, да я как бы и не успел ) Но всё равно, что значит

Цитата
если обозначить класс статичным

?

такое разве бывает ? Если и бывает, то это явно не делание статическими всех членов, что-то другое.

Сообщение отредактировал Алексей1153 - 13.10.2011, 11:25
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 28.11.2024, 14:57