Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2010, 14:25   #1
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию Описание и определение по Страуструпу.

При решении упражнений из книги "Бьярн Страуструп - Язык программирования C++" зашёл в тупик. Я понимаю описание как указание имя переменной и её типа, но при этом
Код:
char ch;
выделяется память, поэтому описание является определением. Вопрос! Как написать описание и определение отдельно?
Мой вариант:
Код:
extern char ch;
char ch;
Заранее благодарен, Алексей.
KemanSR вне форума Ответить с цитированием
Старый 29.11.2010, 14:43   #2
c++ learner
Пользователь
 
Регистрация: 19.12.2008
Сообщений: 38
По умолчанию

extern - указывает на то, что переменная определена где-то в другом месте и является внешней

*.h
extern int num;

*.cpp
int num = 0;

так переменная определяется в другом месте и является внешней т.е. она будет видна в тех модулях куда будет присоединен *.h c ее описанием.

Если же рассуждать в категориях описание/определение

То это…

Код:
Class Box 
{
Public:
Box() {};
~Box() {};
int x;
int y;
int z;
int getVolume(); 
}
– это описание.


Box box1(); - это определение;

И в таком же духе полагаю и далее…
char – описание ( некоторого общего понятия )
char c – определение (конкретного случая )
"...в самом начале было слово.." т.е. 16-битное битовое поле.
c++ learner вне форума Ответить с цитированием
Старый 29.11.2010, 14:51   #3
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию

Это всё понятно, но всё-же в случае с "char", как написать описание отдельно от определения? Если это не возможно, почему Страуструп задаёт такие упражнения?
KemanSR вне форума Ответить с цитированием
Старый 29.11.2010, 14:57   #4
c++ learner
Пользователь
 
Регистрация: 19.12.2008
Сообщений: 38
По умолчанию

Ну почему же вот к примеру…

*.h

int exampleFunction( int , char* ) – вот тут мне кажется оно имеет место быть (описание без определения)

*.cpp

int exampleFunction( int n, char* str)
{
//Ту-Ду Самфинг))
}
"...в самом начале было слово.." т.е. 16-битное битовое поле.
c++ learner вне форума Ответить с цитированием
Старый 29.11.2010, 15:17   #5
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию

Я считаю что описания это:
Код:
struct SomeStructure;
int SomeFunction(int iPar);
class SomeClass
{
	int iPar;
	char cPar;
};
потому что они не создают объектов а просто их описывают. Но как быть со стандартными типами( в часности с "char")?
Вопрос! Существует ли отдельно описание и определение для стандартных типов?
KemanSR вне форума Ответить с цитированием
Старый 29.11.2010, 16:13   #6
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
Сообщение от KemanSR Посмотреть сообщение
Но как быть со стандартными типами( в часности с "char")?
Вопрос! Существует ли отдельно описание и определение для стандартных типов?
Существует - 1) extern 2) static внутри класса.
still_alive вне форума Ответить с цитированием
Старый 29.11.2010, 16:48   #7
c++ learner
Пользователь
 
Регистрация: 19.12.2008
Сообщений: 38
По умолчанию

Цитата:
Существует ли отдельно описание и определение для стандартных типов?
А ввод нового не катит?)
Код:
typedef char MYCHAR;
Цитата:
2) static внутри класса.
static члены уже память резервируют, на этапе сборки приложения даже, помойму это не описания.

Цитата:
1) extern
без своего определения которое будет написано в коде, он что из себя представляет?)
"...в самом начале было слово.." т.е. 16-битное битовое поле.

Последний раз редактировалось c++ learner; 29.11.2010 в 17:03.
c++ learner вне форума Ответить с цитированием
Старый 29.11.2010, 18:14   #8
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию

Какое-же решение у упражнения из Срауструпа.
"Для каждого описания сделать следующее: если описание не является определением, то написать соответствующее определение; если же описание является определением, написать для него описание, которое не являлось бы одновременно и определением."
Код:
char ch;
int count = 1;
char* name = "Njal";
struct complex { float re, im; };
complex cvar;
extern complex sqrt(complex);
extern int error_number;
typedef complex point;
float real(complex* p) { return p->re; };
const double pi = 3.1415926535897932385;
struct user;
template<class T> abs(T a) { return a<0? -a : a; }
enum beer { Carlsberg, Tuborg, Thor };
KemanSR вне форума Ответить с цитированием
Старый 29.11.2010, 18:34   #9
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
Сообщение от c++ learner Посмотреть сообщение
static члены уже память резервируют, на этапе сборки приложения даже, помойму это не описания.
Ну во-первых, это как минимум описания. Во-вторых, сколько sizeof даст здесь для x?) Можете попробовать еще вывести неинициализированное значение для int'a)
Код:
class X;
class A {
public:
  static X x;
};
Цитата:
Сообщение от c++ learner Посмотреть сообщение
без своего определения которое будет написано в коде, он что из себя представляет?)
А причем тут определение? В одном месте объявление, в другом определение, только и всего. В чем проблема?

PS Думаю, в эпической битве между вами и стандартом победит стандарт)

Код:
// [Example: all but one of the following are definitions:
int a; // defines a
extern const int c = 1; // defines c
int f(int x) { return x+a; } // defines f and defines x
struct S { int a; int b; }; // defines S, S::a, and S::b
struct X { // defines X
int x; // defines nonstatic data member x
static int y; // declares static data member y
X(): x(0) { } // defines a constructor of X
};
int X::y = 1; // defines X::y
enum { up, down }; // defines up and down
namespace N { int d; } // defines N and N::d
namespace N1 = N; // defines N1
X anX; // defines anX

// whereas these are just declarations:
extern int a; // declares a
extern const int c; // declares c
int f(int); // declares f
struct S; // declares S
typedef int Int; // declares Int
extern X anotherX; // declares anotherX
using N::d; // declares N::d
// —end example]
KemanSR
Посмотрите пример из стандарта и сделайте по аналогии.
still_alive вне форума Ответить с цитированием
Старый 29.11.2010, 19:52   #10
c++ learner
Пользователь
 
Регистрация: 19.12.2008
Сообщений: 38
По умолчанию

still_alive
Цитата:
Ну во-первых, это как минимум описания...
Предваряя ваше «ну во-первых» я не телепат и что вы там в static возводить собрались знать не мог. Речь шла о стандартных типах, насколько я понимаю Тип class X, А – это все-таки пользовательский тип данных. Механика языка такое позволяет – да, в вашем случае это описание. И опять же поскольку я не телепат, я представлял себе код типа такого, поэтому собственно и указал на то что это не описание static члена класса (а определение для всех подобных).

Код:
class Z 
{
public:
	static int Count;
};
int Z::Count = 0;
Вешать(sizeof) и выводить его можно сколь угодно.

Цитата:
А причем тут определение? В одном месте объявление, в другом определение, только и всего. В чем проблема?
У меня нету проблем)

extern – модификатор класса памяти.

Выше же тоже самое привел, и потом скажите вам сильно нужен extern int n без где-то реализованного данного int n (= 0)?, я клоню к тому, что сам по себе он не имеет большого смыла, extern int n - частный описатель (n это не тип).
В то время как допустим на примере int;

Код:
x= (int) y;
vector<int> v;
int getVolume( int , int, int);
mem_used = SizeOf(int)*4
"...в самом начале было слово.." т.е. 16-битное битовое поле.
c++ learner вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Описание задачи Dolgan Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 26.11.2010 15:22
описание класса SvetaLee Помощь студентам 1 30.10.2010 23:27
Описание функции A_Orlov Паскаль, Turbo Pascal, PascalABC.NET 1 14.06.2010 14:48
Описание к программе May7768 Помощь студентам 0 12.05.2010 17:52
Описание процедуры phantom4eg Помощь студентам 6 17.03.2009 18:55