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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объявление или определение? 
:(
    Опции темы
FCM
Дата 9.7.2009, 08:19 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Задание интерфейса класса (не совмещенное с реализацией его членов) - объявление или определение? Что-то в лит-ре это по разному называют. Что же имеет место быть на самом деле?
PM MAIL   Вверх
zim22
Дата 9.7.2009, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(FCM @  9.7.2009,  08:19 Найти цитируемый пост)
Что же имеет место быть на самом деле?

определение


--------------------
PM MAIL   Вверх
maxim1000
Дата 9.7.2009, 09:06 (ссылка) |   (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



для класса - определение, для его методов - объявление smile


--------------------
qqq
PM WWW   Вверх
GoldFinch
Дата 9.7.2009, 09:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



class A; - объявление
class A {}; - определение
PM MAIL ICQ   Вверх
FCM
Дата 9.7.2009, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Под определение класса (без определений методов) выделяются ресурсы?
PM MAIL   Вверх
GoldFinch
Дата 9.7.2009, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



FCM, какие ресурсы?
PM MAIL ICQ   Вверх
zim22
Дата 9.7.2009, 15:27 (ссылка)   | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(FCM @  9.7.2009,  15:07 Найти цитируемый пост)
Под определение класса (без определений методов) выделяются ресурсы?

конечно да.
***
под ресурсами я подразумевал размер файла. и я уже не так уверен... smile
сравнил две версии бинарника: один с классом, другой - без.
Код

int main() {
}

Код

class MyClass { };
int main() {
}

размер идентичный, раличны лишь 5 байтов.


Это сообщение отредактировал(а) zim22 - 9.7.2009, 15:46


--------------------
PM MAIL   Вверх
FCM
Дата 9.7.2009, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(GoldFinch @  9.7.2009,  15:25 Найти цитируемый пост)
FCM, какие ресурсы? 

ПРи определении переменных под них выделяется память.
При определении класса (именно класса, а не его объектов), выделяется память?
PM MAIL   Вверх
GoldFinch
Дата 9.7.2009, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



FCM, если у класса есть статические члены, или если включен RTTI (runtime информация о типах)
PM MAIL ICQ   Вверх
FCM
Дата 9.7.2009, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Т.е. получается, что про "описание" С-структуры, говорят как об объявлении, потому что для нее нет ситуаций, когда выделение памяти необходимо, в отличие от классов ( ну и C++ структур), где в некоторых случаях (приведенных выше) выделение памяти происходит?
PM MAIL   Вверх
mes
Дата 9.7.2009, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(GoldFinch @  9.7.2009,  08:49 Найти цитируемый пост)
class A; - объявление
class A {}; - определение 

 

class A;               // пред`объявление класса
class A{...};          // объявление класса
class A{...} a;        // объявление класса и определение переменной
class A{...} extern a; // объявление класса и объявление переменной
А а;                   // определение переменной


был неправ, залез в стандарт :
Цитата

2 A  class-name is inserted into the scope in which it is declared imme-
  diately after the class-name is seen.  The class-name is also inserted
  into  the scope of the class itself.  For purposes of access checking,
  the inserted class name is treated as if it were a public member name.
  A  class-specifier  is  commonly referred to as a class definition.  A
  class is considered defined
 after the closing brace of its class-spec-
  ifier  has  been  seen even though its member functions are in general
  not yet defined.



Это сообщение отредактировал(а) mes - 9.7.2009, 19:57


--------------------
PM MAIL WWW   Вверх
zim22
Дата 9.7.2009, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(mes @  9.7.2009,  19:23 Найти цитируемый пост)
class A{...} extern a; // объявление класса и объявление переменной

может определение класса?


--------------------
PM MAIL   Вверх
mes
Дата 9.7.2009, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(GoldFinch @  9.7.2009,  14:41 Найти цитируемый пост)
FCM, если у класса есть статические члены,

нет, память под статическую переемменую в описании класса не отводится,
Код

class A { static int a; } // тут под нее не выделено ни байта

int А::a; // а вот тут определяем эту переменную и значит выделяется под нее память



Это сообщение отредактировал(а) mes - 9.7.2009, 19:59


--------------------
PM MAIL WWW   Вверх
zim22
Дата 9.7.2009, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(mes @  9.7.2009,  19:29 Найти цитируемый пост)
declaration

что-то я недопонимаю. если это declaration, тогда почему я не могу две переменных объявить?
Цитата

 error C2011: 'C' : 'class' type redefinition

Код

class C {} extern a;
class C {} extern b;



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


любитель
****


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

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



Цитата(zim22 @  9.7.2009,  18:42 Найти цитируемый пост)
что-то я недопонимаю. если это declaration, тогда почему я не могу две переменных объявить?

это я чего то напутал, сорри .. исправился в верхнем посту.



--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 9.7.2009, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



zim22, ты объявляеш 2 класса с 1 именем, че ты хотел %)
PM MAIL ICQ   Вверх
zim22
Дата 9.7.2009, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(GoldFinch @  9.7.2009,  21:13 Найти цитируемый пост)
ы объявляеш 2 класса с 1 именем, че ты хотел %)

докопаться до истины. т.к. форма записи с фигурными скобками (определение класса) не совпадала с mes'овой интерпретацией. 
Цитата(mes @  9.7.2009,  19:23 Найти цитируемый пост)
class A{...} extern a; // объявление класса и объявление переменной


истина:
если необходимо объявить несколько переменных типа класса, то делается это так:
Код

extern C a, b, c;

т.е. фигурные скобки не должны указываться.


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


--------------------
PM MAIL   Вверх
GoldFinch
Дата 9.7.2009, 23:11 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



zim22,  
extern class C {} a,b,c;
PM MAIL ICQ   Вверх
zim22
Дата 10.7.2009, 07:55 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



GoldFinch, 
вы ошибаетесь. обратите внимание на этот пост.



--------------------
PM MAIL   Вверх
GoldFinch
Дата 10.7.2009, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



да действительно, в extern определять переменные нельзя
нет)
голословные утверждения хорошо, но эксперимент всегда лучше.

Код

// main.cpp

extern
class A 
{
public:
    int f;
} a,b;


int main()
{
    return a.f+b.f;    
}

Код

// foo.cpp

extern
class A 
{
public:
    int f;
} a={5}, b={6};

Код

Программа "[1508] syn_test.exe: Машинный код" завершилась с кодом 11 (0xb).


Добавлено через 8 минут и 56 секунд
в дальнейшем предлагаю не расставлять минусы к постам, а выкладывать рабочий пруфкод, не так уж это и сложно

Это сообщение отредактировал(а) GoldFinch - 10.7.2009, 14:49
PM MAIL ICQ   Вверх
zim22
Дата 10.7.2009, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(GoldFinch @  10.7.2009,  14:42 Найти цитируемый пост)
предлагаю не расставлять минусы к постам, а выкладывать рабочий пруфкод

выкладываю. код не линкуется (error LNK2001: unresolved external symbol "class A a")
не подскажете, как здесь объявить переменные a,b используя вашу форму записи?
что-то у меня не получается...
Цитата(GoldFinch @  9.7.2009,  23:11 Найти цитируемый пост)
extern class C {} a,b,c;


Код

// foo.cpp

extern
class A 
{
public:
  A() : f(1) { }
  int f;
  int fcn1() { return 5; }
} a, b;

Код

// main.cpp

extern
class A 
{
public:
  A();
  int f;
  int fcn1();
} a, b;

int main()
{
   return a.f + b.fcn1();    
}





--------------------
PM MAIL   Вверх
GoldFinch
Дата 10.7.2009, 15:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



zim22, у тебя 2 разных класса в модулях, поэтому и происходит ошибка линковки. 
в строчке  return a.f + b.fcn1();   переменные объявлены, но линкер не может найти их определение, потому что его нет.

Добавлено @ 15:39
правильный код выглядит так:

Код

//main.cpp

extern
class A 
{
public:
    A() : f(1) { }
    int f;
    int fcn1() { return 5; }
} a,b;


int main()
{
    return a.f+b.fcn1();    
}

Код

//foo.cpp

extern
class A 
{
public:
    A() : f(1) { }
    int f;
    int fcn1() { return 5; }
} a=A(), b=A();

Код

Программа "[3872] syn_test.exe: Машинный код" завершилась с кодом 6 (0x6).

Добавлено @ 15:40
в main.cpp переменные объявлены, в foo.cpp переменные объявлены и определены.
типы переменных одинаковы

Это сообщение отредактировал(а) GoldFinch - 10.7.2009, 15:40
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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