Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Unresolved Error 
:(
    Опции темы
040375
Дата 6.6.2007, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 6.4.2006

Репутация: нет
Всего: 2



Builder C++ 6
линковщик не может скомпоновать следующий код

Код

#include <vcl.h>
#pragma hdrstop

#include "main.h"
#include "PPP.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
// это простая кнопка - нажатие на ней вызывает статический метод set_set класса PPP
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    int i=1;
    PPP::set_set(i);
}

// определение самого класса
// PPP.h
class PPP {


    public:
     static int obj;
     static void set_obj (int so);
        static void set_set (int);
};

#include "PPP.h"

// PPP.cpp - реализация статических методов класса
// как вы наверное поняли - это маленький стенд - ошибка ровно такого рода рода
// возникает в приложении
void PPP::set_set (int o) {
    set_obj(o);
}

void PPP::set_obj (int so) {
    obj=so;
}



Компилятор всё нормально пропускает, Линковщик выдаёт ошибку

[Linker Error] Unresolved external 'PPP::obj' referenced from E:\C_PROJECTS\BCBUILDER_PROJECTS\TEST_STATIC_MEMBER\PPP.OBJ

как я понял - линковщик почему-то не видит статический член класса - почему?
Что не так сделано? Ведь стандарт С++, насколько я помню, позволяет это, раз компилятор не сругался. Из этого положения конечно есть масса выходов - но хотелось бы знать - в чём причина именно при этом.  
PM MAIL   Вверх
Fazil6
Дата 6.6.2007, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 11
Всего: 60



Цитата(040375 @  6.6.2007,  13:11 Найти цитируемый пост)
как я понял - линковщик почему-то не видит статический член класса - почему?

потому что переменная только объявлена, но не определена. 
Код

int PPP::obj = 0;


PM MAIL   Вверх
Burka
Дата 6.6.2007, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



может потому что #include "PPP.h" два раза в коде?


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
040375
Дата 6.6.2007, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 6.4.2006

Репутация: нет
Всего: 2



Не думаю,  дело не в том, что два раза #include - а иначе то вообще как подключать реализацию и использовать её, к тожу же там разумеется #ifndef PPP_C.....и т.д. перед определением класса.
Да, дело именно в том - что она была только объявлена, но почему нестатические члены можно не инициализировать явно (они по умолчанию в конструкторе инициализацию проходят), а статические не инициализируются по умолчанию? Дайте пожалуйста ссылочку - где подробно почитать про это, а то эти вопросы во многих источниках как то объходят
PM MAIL   Вверх
Fazil6
Дата 6.6.2007, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 11
Всего: 60



Цитата(040375 @  6.6.2007,  20:21 Найти цитируемый пост)
но почему нестатические члены можно не инициализировать явно (они по умолчанию в конструкторе инициализацию проходят), а статические не инициализируются по умолчанию?
 
суть не в инициализации... Суть в определении. Нестатические члены создаются при создании объекта. Статик данные общие для всех объектов класса и естественно никакого отношения к созданию объектов не имеют, поэтому такие члены нужно определять каждый самостоятельно.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0569 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.