Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> unresolved external symbol 
V
    Опции темы
ZufuS
Дата 19.8.2007, 04:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

//figure.h

#if !defined(AFX_FIGURE_H__D71F35C8_74A2_4842_93FB_75BFC7F4322D__INCLUDED_)
#define AFX_FIGURE_H__D71F35C8_74A2_4842_93FB_75BFC7F4322D__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif

class Figure  
{
protected:
    COLORREF color;
    static HDC hdc;
public:
    Figure(COLORREF color) { SetColor(color); }
    virtual ~Figure();
    virtual void Draw() const = 0;
    virtual void Move(int delta_x, int delta_y) = 0;
    void SetColor(COLORREF) { this->color = color; }
    void Sethdc(HDC hdc) { this->hdc = hdc; }
};

#endif

Код

//F_Rectangle.h
#if !defined(AFX_F_RECTANGLE_H__2CCA80E4_74C7_4154_AD31_B82D051FDC4E__INCLUDED_)
#define AFX_F_RECTANGLE_H__2CCA80E4_74C7_4154_AD31_B82D051FDC4E__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif

#include "Figure.h"

class F_Rectangle: public Figure
{
    int left, top, right, bottom;
public:
    F_Rectangle(COLORREF color=RGB(0,0,0)): Figure(color) {}
    F_Rectangle(int left, int top, int right, int bottom, COLORREF color=RGB(0,0,0));
    ~F_Rectangle();
    void Draw();
};

#endif

Код

//F_Rectangle.cpp
#include "stdafx.h"
#include "F_Rectangle.h"

F_Rectangle::F_Rectangle(int left, int top, int right, int bottom, COLORREF color)
:Figure(color) 
{
    this->left        = left;
    this->top        = top;
    this->right        = right;
    this->bottom    = bottom;
}

F_Rectangle::~F_Rectangle()
{

}

void F_Rectangle::Draw()
{
    Rectangle(Figure::hdc, left, top, right, bottom);
}

F_Rectangle.obj : error LNK2001: unresolved external symbol "protected: static struct HDC__ * Figure::hdc" (?hdc@Figure@@1PAUHDC__@@A)
Debug/k1.exe : fatal error LNK1120: 1 unresolved externals
что ему не нравится, и как с этим бороться?
PM   Вверх
MAKCim
Дата 19.8.2007, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



в F_Rectangle.cpp напиши
Код

HDC Figure :: hdc = <какое-нибудь дефолтное значение>;



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Бывалый
*


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

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



Это хороший стиль? Он же будет вызываться чаще чем надо. У меня не только F_Rectangle будет наследовать Figure, это значит в каждый надо написать?
PM   Вверх
bsa
Дата 19.8.2007, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 63
Всего: 196



Так. ты объявил hdc статическим членом класса. Поэтому ты должен задать его значение на этапе компиляции, так как потом ты не сможешь узнать, проинициализирован он или нет, так как эта переменная общая для все экземпляров Figure и ее потомков!
PM   Вверх
ZufuS
Дата 19.8.2007, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(MAKCim @  19.8.2007,  10:03 Найти цитируемый пост)
HDC Figure :: hdc = <какое-нибудь дефолтное значение>;

почему hdc пишется вместе с типом, ведь он уже известен в объявлении класса.  он чтоли дважды объявляется?
PM   Вверх
MAKCim
Дата 19.8.2007, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



ZufuS
а почему мы тип возвращаемого значения во внешней реализации метода указываем
он ведь известен в объявлении класса?  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
ZufuS
Дата 19.8.2007, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



обычно если при инициализации переменной написать её тип, но после того как она уже объявлена, компилятору не понравится то что её объявили два раза. а здесь наоборот.
PM   Вверх
MAKCim
Дата 19.8.2007, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



ZufuS
речь идет о классах
тут уместна аналогия с методом


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
ZufuS
Дата 19.8.2007, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ясно, всё работает, спасибо. Буду рад, если кто-нибудь объяснит, почему здесь уместна аналогия с методом.
PM   Вверх
zkv
Дата 19.8.2007, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Да, вопрос интересный, по идее методами тоже можно было бы не указывать тип возвращаемого значения в реализации, ведь он задан при объявлении. 
Видимо для наглядности указывается, как для методов, так и для статических членов-данных, не вижу других причин, если они есть тоже буду рад услышать обоснование.
PM MAIL   Вверх
DjoNIK
Дата 19.8.2007, 20:39 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 28.9.2006
Где: Питер/Георгиевск

Репутация: 4
Всего: 5



Цитата

обычно если при инициализации переменной написать её тип, но после того как она уже объявлена, компилятору не понравится то что её объявили два раза. а здесь наоборот.

Определение класса - не одно и то же, что определение объекта класса(или его статичеких членов).

Определение класса никак не отображается на выделении памяти в программе. Мы выносим определение членов класса с указанием типа для выделения определённого количества памяти.
Если я правильно понимаю.


Это сообщение отредактировал(а) DjoNIK - 19.8.2007, 21:21


--------------------
- Плесни-ка мне холодного кипятку.
- Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды?
- Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку.
(разговор петербуржца и москвича)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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