Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Раздельная компиляция, C++  (Прочитано 2934 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Kravensky

  • Автор темы
  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Раздельная компиляция, C++
« : 23 Февраль 2012, 14:48:08 »
Начал изучать C++. Прочитал статью закреплённую. Хелловорлд и прочие мелкие поделки компилируются нормально. Сейчас нужно, чтобы класс и демонстрационная программа были в разных файлах. Попытка скомпилировать файл с классом не приводит к желаемому результату.
Текст:
#include <iostream>
#include <cmath>
#include <new>

/* Класс для работы с квадратными матрицами */
class matrix
{
int order, **coefficents_set;
static bool indication;

public:
matrix (); // Конструктор по умолчанию
matrix (const matrix &copied_object); // Конструктор копирования
matrix (int n); // Перегруженный конструктор для создания матриц заранее заданного размера
~matrix (); // Деструктор

bool get_object_memory (); // Выделение динамической памяти квадратной матрице

int determinant_calculation (); // Расчёт определителя

matrix *transposition (); // Транспонирование матрицы

static bool condition (); // Проверка состояния матриц (возникновения ошибок)

void init (); // Ручной ввод элементов матрицы
void output (); // Вывод матрицы
void put_element (int j, int i, int n); // Добавление или переписывание одного коэффицента
}

static bool matrix::indication;

/* Конструктор класса matrix по умолчанию */
matrix::matrix ()
{
cout << "Введите порядок квадратной матрицы" << endl;
cin >> order;

coefficents_set = NULL;
}

/* Конструктор копирования класса matrix */
matrix::matrix (const matrix &copied_object)
{
order = copied_object.order;
get_object_memory ();

for (int i = 0; i <= order - 1; i++)
for (int j = 0; j <= order - 1; j++)
coefficents_set [i] [j] = copied_object.coefficents_set [i] [j];
}

/* Перегруженный конструктор класса matrix - для создания матриц с заранее заданным порядком */
matrix::matrix (int n)
{
order = n;
coefficents_set = NULL;
}

/* Деструктор класса matrix */
matrix::~matrix ()
{
if (coefficents_set != NULL)
{
for (int i = 0; (i <= order - 1) && (coefficents_set != NULL); i++)
delete coefficents_set [i];

delete coefficents_set;
}
}

/* Выделение динамической памяти квадратной матрице */
bool matrix::get_object_memory ()
{
if (order >= 1)
{
try
{
coefficents_set = new int * [order];
} catch (bad_alloc xa)
{
indication = true;
coefficents_set = NULL;
cout << "Ошибка при выделении памяти (строки)." << endl;
}

for (int i = 0; (i <= order - 1) && (!indication); i++)
{
try
{
coefficents_set [i] = new int [order];
} catch (bad_alloc xa)
{
indication = true;
coefficents_set [i] = NULL;
cout << "Ошибка при выделении памяти (столбцы)." << endl;
}
}
}
else
{
cout << "Недопустимое значение порядка." << endl;
indication = true;
}

if (indication)
cout << "Аварийное завершение программы." << endl;
else
{
cout << "Память успешно выделена." << endl;
}

return indication;
}

/* Расчёт определителя */
int matrix::determinant_calculation ()
{
int determinant = 0;

if (order == 1)
determinant = coefficents_set [0] [0];
else if (order == 2)
determinant = coefficents_set [0] [0] * coefficents_set [1] [1] - coefficents_set [0] [1] * coefficents_set [1] [0];
else
for (int i = 0, j = 0; j <= order - 1; j++)
{
matrix minor (order - 1);
minor.get_object_memory ();

if (!(condition () ) )
{
for (int m = 0, x = 0; (m <= order - 1) && (x <= order - 2); m++)
if (m != i)
{
for (int n = 0, y = 0; (n <= order - 1) && (y <= order - 2); n++)
if (n != j)
{
minor.put_element (x, y, coefficents_set [m] [n] );
y++;
}

x++;
}
determinant += coefficents_set [i] [j] * ( (int)pow ( (double)(-1), i + j) ) * minor.determinant_calculation ();
}
}

return determinant;
}

/* Транспонирование матрицы */
matrix *matrix::transposition ()
{
matrix *transposed_matrix;

try
{
transposed_matrix = new matrix;
} catch (bad_alloc xa)
{
cout << "Ошибка при выделении памяти (транспонирование)" << endl;
transposed_matrix = NULL;
}

if (transposed_matrix != NULL)
{
transposed_matrix -> get_object_memory ();

if (!(condition () ) )
for (int i = 0; i <= order - 1; i++)
for (int j = 0; j <= order - 1; j++)
transposed_matrix -> put_element (j, i, coefficents_set [i] [j]);
else
transposed_matrix = NULL;
}

return transposed_matrix;
}

/* Информация о возникновении ошибок */
bool matrix::condition ()
{
return indication;
}

/* Ручной ввод элементов матрицы */
void matrix::init ()
{
for (int i = 0; i <= order - 1; i++)
for (int j = 0; j <= order - 1; j++)
{
cout << "Введите элемент [" << i + 1 << "] [" << j + 1 << "]: ";
cin >> coefficents_set [i] [j];
}

cout << "Матрица успешно создана." << endl;
}

/* Вывод матрицы */
void matrix::output ()
{
setf (ios::left);
unsetf (ios::right);
width (3);

for (int i; i <= order - 1; i++)
{
cout << "|";

for (int j; j <= order - 1; j++)
cout << coefficents_set [i] [j];

cout << "|" << endl;
}
}

/* Добавление или переписывание одного коэффицента */
void matrix::put_element (int j, int i, int n)
{
coefficents_set [j] [i] = n;
}

Для компиляции использую следующую команду:
g++ -c -o class.o class.cpp
Вывод компилятора:
class.cpp:30:21: error: two or more data types in declaration of ‘indication’
class.cpp: In constructor ‘matrix::matrix()’:
class.cpp:35:2: error: ‘cout’ was not declared in this scope
class.cpp:35:81: error: ‘endl’ was not declared in this scope
class.cpp:36:2: error: ‘cin’ was not declared in this scope
class.cpp: In member function ‘bool matrix::get_object_memory()’:
class.cpp:79:12: error: expected type-specifier before ‘bad_alloc’
class.cpp:79:22: error: expected ‘)’ before ‘xa’
class.cpp:79:22: error: expected ‘{’ before ‘xa’
class.cpp:79:22: error: ‘xa’ was not declared in this scope
class.cpp:79:24: error: expected ‘;’ before ‘)’ token
class.cpp:91:14: error: expected type-specifier before ‘bad_alloc’
class.cpp:91:24: error: expected ‘)’ before ‘xa’
class.cpp:91:24: error: expected ‘{’ before ‘xa’
class.cpp:91:26: error: expected ‘;’ before ‘)’ token
class.cpp:101:3: error: ‘cout’ was not declared in this scope
class.cpp:101:74: error: ‘endl’ was not declared in this scope
class.cpp:106:3: error: ‘cout’ was not declared in this scope
class.cpp:106:76: error: ‘endl’ was not declared in this scope
class.cpp:109:3: error: ‘cout’ was not declared in this scope
class.cpp:109:62: error: ‘endl’ was not declared in this scope
class.cpp: In member function ‘matrix* matrix::transposition()’:
class.cpp:159:11: error: expected type-specifier before ‘bad_alloc’
class.cpp:159:21: error: expected ‘)’ before ‘xa’
class.cpp:159:21: error: expected ‘{’ before ‘xa’
class.cpp:159:21: error: ‘xa’ was not declared in this scope
class.cpp:159:23: error: expected ‘;’ before ‘)’ token
class.cpp: In member function ‘void matrix::init()’:
class.cpp:192:4: error: ‘cout’ was not declared in this scope
class.cpp:193:4: error: ‘cin’ was not declared in this scope
class.cpp:196:2: error: ‘cout’ was not declared in this scope
class.cpp:196:61: error: ‘endl’ was not declared in this scope
class.cpp: In member function ‘void matrix::output()’:
class.cpp:202:8: error: ‘ios’ has not been declared
class.cpp:202:17: error: ‘setf’ was not declared in this scope
class.cpp:203:10: error: ‘ios’ has not been declared
class.cpp:203:20: error: ‘unsetf’ was not declared in this scope
class.cpp:204:10: error: ‘width’ was not declared in this scope
class.cpp:208:3: error: ‘cout’ was not declared in this scope
class.cpp:213:18: error: ‘endl’ was not declared in this scope
Судя по выводу, если я правильно понял, почему-то не подключаются заголовки. Хотелось бы узнать, в чём проблема, и как её решить.
« Последнее редактирование: 23 Февраль 2012, 15:29:24 от Kravensky »

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: Раздельная компиляция, C++
« Ответ #1 : 23 Февраль 2012, 15:02:58 »
1. спойлером не умеете пользоваться - так не пользуйтесь.

2.
Судя по выводу, если я правильно понял, почему-то не подключаются заголовки. Хотелось бы узнать, в чём проблема, и как её решить.
неправильно понял ;) - там элементарные синтаксические ошибки, связанные с namespace ... но не только они:
class.cpp:30:21: error: two or more data types in declaration of ‘indication’
class.cpp: In constructor ‘matrix::matrix()’:
class.cpp:35:2: error: ‘cout’ was not declared in this scope
class.cpp:35:81: error: ‘endl’ was not declared in this scope
class.cpp:36:2: error: ‘cin’ was not declared in this scope
class.cpp: In member function ‘bool matrix::get_object_memory()’:

3. раздельная компиляция в С++ не имеет ни малейших особенностей в сравнении с ней же в С.
посмотрите здесь:
http://rus-linux.net/nlib.php?name=/MyLDP/BOOKS/Linux-tools/index.html
может что-то для себя найдёте.

Оффлайн Kravensky

  • Автор темы
  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Re: Раздельная компиляция, C++
« Ответ #2 : 23 Февраль 2012, 15:11:50 »
1. Не понял ремарку - что не так?
2. Я знал, что я что-то забыл %) Спасибо.
3. Спасибо за ссылку, почитаю.

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: Раздельная компиляция, C++
« Ответ #3 : 23 Февраль 2012, 15:24:37 »
1. Не понял ремарку - что не так?
да то, что они не раскрываются

Оффлайн Kravensky

  • Автор темы
  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Re: Раздельная компиляция, C++
« Ответ #4 : 23 Февраль 2012, 15:29:39 »
 ??? В предпросмотре работали нормально. Убрал.

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: Раздельная компиляция, C++
« Ответ #5 : 23 Февраль 2012, 15:33:45 »
а cout / cin в методах класса, да ещё и в конструкторе - это просто жуть! ;) ... "это что-то с чем-то" ;)

Оффлайн Kravensky

  • Автор темы
  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Re: Раздельная компиляция, C++
« Ответ #6 : 23 Февраль 2012, 15:43:37 »
Не спорю  :P Но избавляться от них буду позже.

Следующий вопрос. Вывод компилятора, в итоге удалось свести к одной строке:

class.cpp:31:14: error: two or more data types in declaration of ‘indication’.

Теряюсь в догадках. Неужто переменная типа bool не может быть статической? И, если может - в чём тогда проблема?

Исправленный (не до конца) код:

#include <iostream>
#include <cmath>
#include <new>
using namespace std;

/* Класс для работы с квадратными матрицами */
class matrix
{
int order, **coefficents_set;
static bool indication;

public:
matrix (); // Конструктор по умолчанию
matrix (const matrix &copied_object); // Конструктор копирования
matrix (int n); // Перегруженный конструктор для создания матриц заранее заданного размера
~matrix (); // Деструктор

bool get_object_memory (); // Выделение динамической памяти квадратной матрице

int determinant_calculation (); // Расчёт определителя

matrix *transposition (); // Транспонирование матрицы

static bool condition (); // Проверка состояния матриц (возникновения ошибок)

void init (); // Ручной ввод элементов матрицы
void output (); // Вывод матрицы
void put_element (int j, int i, int n); // Добавление или переписывание одного коэффицента
}

bool matrix::indication;

/* Конструктор класса matrix по умолчанию */
matrix::matrix ()
{
cout << "Введите порядок квадратной матрицы" << endl;
cin >> order;

coefficents_set = NULL;
}

/* Конструктор копирования класса matrix */
matrix::matrix (const matrix &copied_object)
{
order = copied_object.order;
get_object_memory ();

for (int i = 0; i <= order - 1; i++)
for (int j = 0; j <= order - 1; j++)
coefficents_set [i] [j] = copied_object.coefficents_set [i] [j];
}

/* Перегруженный конструктор класса matrix - для создания матриц с заранее заданным порядком */
matrix::matrix (int n)
{
order = n;
coefficents_set = NULL;
}

/* Деструктор класса matrix */
matrix::~matrix ()
{
if (coefficents_set != NULL)
{
for (int i = 0; (i <= order - 1) && (coefficents_set != NULL); i++)
delete coefficents_set [i];

delete coefficents_set;
}
}

/* Выделение динамической памяти квадратной матрице */
bool matrix::get_object_memory ()
{
if (order >= 1)
{
try
{
coefficents_set = new int * [order];
} catch (bad_alloc xa)
{
indication = true;
coefficents_set = NULL;
cout << "Ошибка при выделении памяти (строки)." << endl;
}

for (int i = 0; (i <= order - 1) && (!indication); i++)
{
try
{
coefficents_set [i] = new int [order];
} catch (bad_alloc xa)
{
indication = true;
coefficents_set [i] = NULL;
cout << "Ошибка при выделении памяти (столбцы)." << endl;
}
}
}
else
{
cout << "Недопустимое значение порядка." << endl;
indication = true;
}

if (indication)
cout << "Аварийное завершение программы." << endl;
else
{
cout << "Память успешно выделена." << endl;
}

return indication;
}

/* Расчёт определителя */
int matrix::determinant_calculation ()
{
int determinant = 0;

if (order == 1)
determinant = coefficents_set [0] [0];
else if (order == 2)
determinant = coefficents_set [0] [0] * coefficents_set [1] [1] - coefficents_set [0] [1] * coefficents_set [1] [0];
else
for (int i = 0, j = 0; j <= order - 1; j++)
{
matrix minor (order - 1);
minor.get_object_memory ();

if (!(condition () ) )
{
for (int m = 0, x = 0; (m <= order - 1) && (x <= order - 2); m++)
if (m != i)
{
for (int n = 0, y = 0; (n <= order - 1) && (y <= order - 2); n++)
if (n != j)
{
minor.put_element (x, y, coefficents_set [m] [n] );
y++;
}

x++;
}
determinant += coefficents_set [i] [j] * ( (int)pow ( (double)(-1), i + j) ) * minor.determinant_calculation ();
}
}

return determinant;
}

/* Транспонирование матрицы */
matrix *matrix::transposition ()
{
matrix *transposed_matrix;

try
{
transposed_matrix = new matrix;
} catch (bad_alloc xa)
{
cout << "Ошибка при выделении памяти (транспонирование)" << endl;
transposed_matrix = NULL;
}

if (transposed_matrix != NULL)
{
transposed_matrix -> get_object_memory ();

if (!(condition () ) )
for (int i = 0; i <= order - 1; i++)
for (int j = 0; j <= order - 1; j++)
transposed_matrix -> put_element (j, i, coefficents_set [i] [j]);
else
transposed_matrix = NULL;
}

return transposed_matrix;
}

/* Информация о возникновении ошибок */
bool matrix::condition ()
{
return indication;
}

/* Ручной ввод элементов матрицы */
void matrix::init ()
{
for (int i = 0; i <= order - 1; i++)
for (int j = 0; j <= order - 1; j++)
{
cout << "Введите элемент [" << i + 1 << "] [" << j + 1 << "]: ";
cin >> coefficents_set [i] [j];
}

cout << "Матрица успешно создана." << endl;
}

/* Вывод матрицы */
void matrix::output ()
{
cout.setf (ios::left);
cout.unsetf (ios::right);
cout.width (3);

for (int i; i <= order - 1; i++)
{
cout << "|";

for (int j; j <= order - 1; j++)
cout << coefficents_set [i] [j];

cout << "|" << endl;
}
}

/* Добавление или переписывание одного коэффицента */
void matrix::put_element (int j, int i, int n)
{
coefficents_set [j] [i] = n;
}

UPD: Проблема решена, вопрос исчерпан.
« Последнее редактирование: 23 Февраль 2012, 16:51:21 от Kravensky »

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: Раздельная компиляция, C++
« Ответ #7 : 23 Февраль 2012, 17:44:58 »
Следующий вопрос. Вывод компилятора, в итоге удалось свести к одной строке:

class.cpp:31:14: error: two or more data types in declaration of ‘indication’.

Теряюсь в догадках. Неужто переменная типа bool не может быть статической? И, если может - в чём тогда проблема?

1. проблема у вас не в том: всё что угодно может быть static ...
2. но на первых порах вообще не играйтесь с членами static в классе,
3. это вовсе не то, что приписывается static в С ... и не то, что вы предполагаете,
4. наилучшим образом это объяснено в Java, где такие static члены класса названы как переменные класса, в отличие от не static, которые - переменные объекта.

Оффлайн Kravensky

  • Автор темы
  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Re: Раздельная компиляция, C++
« Ответ #8 : 23 Февраль 2012, 18:26:42 »
UPD: Проблема решена, вопрос исчерпан.
Опять элементарная ошибка от невнимательности - отсутствие точки с запятой после определения класса.

Цитировать
3. это вовсе не то, что приписывается static в С ... и не то, что вы предполагаете,
Переменная, общая для всех объектов данного класса?

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: Раздельная компиляция, C++
« Ответ #9 : 23 Февраль 2012, 18:31:19 »
Цитировать
3. это вовсе не то, что приписывается static в С ... и не то, что вы предполагаете,
Переменная, общая для всех объектов данного класса?

да, одна на всех, и это очень специфично.

вообще, как где-то обсуждает Страуструп, квалификатор ststic очень сильно перегружен (смыслами) в С/C++ (и там и там, и по-разному): это и область видимости, связывания, и время жизни и др.; поэтому попервах с ним нужно аккуратно ... или просто не использовать.

« Последнее редактирование: 23 Февраль 2012, 18:34:17 от Olej »

 

Страница сгенерирована за 0.071 секунд. Запросов: 25.