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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.08.2012, 09:34   #1
mishev
 
Регистрация: 22.08.2012
Сообщений: 5
По умолчанию Ошибка при объявлении переменных

Всем здравствуйте.

Изучаю C++ по книге Дейтела "Как программировать на C++". Примеры программ качаю с сайта. Одна из программ компилится с ошибками, в определении класса GradeBook ей не нравится что переменные students и tests объявлены внутри класса, если объявлять их как глобальные то все окей. Почему так, помогите разобраться пожалуйста.

Вариант кода из книги, не работает

Цитата:
// Fig. 7.23: GradeBook.h
#include <string> // program uses C++ Standard Library string class
using std::string;

class GradeBook
{
public:
// constants
const static int students = 10; // number of students
const static int tests = 3; // number of tests

// constructor initializes course name and array of grades
GradeBook( string, const int [][ tests ] );

void setCourseName( string ); // function to set the course name
string getCourseName(); // function to retrieve the course name
void displayMessage(); // display a welcome message
void processGrades(); // perform various operations on the grade data
private:
string courseName; // course name for this grade book
int grades[ students ][ tests ]; // two-dimensional array of grades
}; // end class GradeBook
Ошибки компиляции

Цитата:
Compiling...
fig07_25.cpp
d:\c++\deitel\ch07\fig07_23\gradebo ok.h(13) : error C2258: illegal pure syntax, must be '= 0'
d:\c++\deitel\ch07\fig07_23\gradebo ok.h(13) : error C2252: 'students' : pure specifier can only be specified for functions
d:\c++\deitel\ch07\fig07_23\gradebo ok.h(14) : error C2258: illegal pure syntax, must be '= 0'
d:\c++\deitel\ch07\fig07_23\gradebo ok.h(14) : error C2252: 'tests' : pure specifier can only be specified for functions
d:\c++\deitel\ch07\fig07_23\gradebo ok.h(16) : error C2065: 'tests' : undeclared identifier
d:\c++\deitel\ch07\fig07_23\gradebo ok.h(16) : error C2087: '<Unknown>' : missing subscript
Error executing cl.exe.

fig07_25.exe - 6 error(s), 2 warning(s)
И рабочий вариант

Цитата:
// Fig. 7.23: GradeBook.h
#include <string> // program uses C++ Standard Library string class
using std::string;

const static int students = 10; // number of students
const static int tests = 3; // number of tests


// GradeBook class definition
class GradeBook
{
public:
// constants

// constructor initializes course name and array of grades
GradeBook( string, const int [][ tests ] );

void setCourseName( string ); // function to set the course name
string getCourseName(); // function to retrieve the course name
void displayMessage(); // display a welcome message
void processGrades(); // perform various operations on the grade data
private:
string courseName; // course name for this grade book
int grades[ students ][ tests ]; // two-dimensional array of grades
}; // end class GradeBook
mishev вне форума Ответить с цитированием
Старый 22.08.2012, 10:23   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

потому что переменные класса нельзя инициализировать внутри дефиниции класса.

int var = 10; // не канает
waleri вне форума Ответить с цитированием
Старый 22.08.2012, 10:30   #3
mishev
 
Регистрация: 22.08.2012
Сообщений: 5
По умолчанию

Неужели в книге ошибка?!
И второй вариант будет правильным?
И как сделать что бы переменные принадлежали классу?
mishev вне форума Ответить с цитированием
Старый 22.08.2012, 10:31   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

описание оставить в хедере, а инициализацию унести в цпп
p51x вне форума Ответить с цитированием
Старый 22.08.2012, 10:38   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от mishev Посмотреть сообщение
Неужели в книге ошибка?!
Это может сильно зависить от компилятора. Переменные точно нельзя в дефиници класса а вот константы на одних версиях канает а на других нет. В книжке наверно написано каким компилятором они пользуются, сравните их версию и вашу версию.
waleri вне форума Ответить с цитированием
Старый 22.08.2012, 10:40   #6
mishev
 
Регистрация: 22.08.2012
Сообщений: 5
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
описание оставить в хедере, а инициализацию унести в цпп
Не получается, сделал вот так

.h

Цитата:
class GradeBook
{
public:
// constants
const static int students; // number of students
const static int tests; // number of tests

// constructor initializes course name and array of grades
GradeBook( string, const int [][ tests ] );
.cpp

Цитата:
int main()
{
GradeBook::students = 10; // number of students
GradeBook::tests = 3; // number of tests
ошибка
Цитата:
d:\c++\deitel\ch07\fig07_23\gradebo ok.h(17) : error C2540: non-constant expression as array bound
d:\c++\deitel\ch07\fig07_23\gradebo ok.h(30) : error C2057: expected constant expression
d:\c++\deitel\ch07\fig07_23\gradebo ok.h(30) : error C2057: expected constant expression
d:\c++\deitel\ch07\fig07_23\gradebo ok.h(30) : error C2087: '<Unknown>' : missing subscript
d:\c++\deitel\ch07\fig07_23\gradebo ok.h(30) : warning C4200: nonstandard extension used : zero-sized array in struct/union
mishev вне форума Ответить с цитированием
Старый 22.08.2012, 10:43   #7
mishev
 
Регистрация: 22.08.2012
Сообщений: 5
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Это может сильно зависить от компилятора. Переменные точно нельзя в дефиници класса а вот константы на одних версиях канает а на других нет. В книжке наверно написано каким компилятором они пользуются, сравните их версию и вашу версию.
Спасибо, буду смотреть. И сори, начальный вопрос неправильно поставил, там у меня константы, а не переменные.
mishev вне форума Ответить с цитированием
Старый 22.08.2012, 11:07   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
.cpp
Прочитайте про статические переменные классов, а?
p51x вне форума Ответить с цитированием
Старый 22.08.2012, 11:25   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от mishev Посмотреть сообщение
Код:
int main()
{
GradeBook::students = 10; // number of students
GradeBook::tests = 3; // number of tests
Где здесь указан тип перемeнной? Читайте про static member variables.
waleri вне форума Ответить с цитированием
Старый 22.08.2012, 12:13   #10
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Код:
class GradeBook {
public:
  static const int students;
  static const int tests;
};

const int GradeBook::students = 10;
const int GradeBook::tests = 3;
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при объявлении массива(Ordinal type expected). Leshii Паскаль, Turbo Pascal, PascalABC.NET 12 31.07.2012 21:03
Ошибка при объявлении файла записей bogdanidze Помощь студентам 2 13.05.2011 08:26
Ошибка перевода переменных grafgrial Общие вопросы Delphi 4 10.10.2010 19:58
Ошибка в объявлении переменных Superlotles Помощь студентам 1 17.12.2009 17:05
Ошибка в переменных Maugli-rus Общие вопросы Delphi 2 24.12.2007 07:44