Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Class matrix


Автор: FTK 12.12.2005, 14:04
Hello World!!!

Помогите кто-нибудь, такая проблема:
есть класс matrix

Код

class matrix
{
double **A;
int size;
public:
matrix (){A=0} //Типа конструктор умолчания
 matrix(double &a)     // Конструктор, который должен создать квадратную матрицу аxa 
   {    int size=a;  //и заполнить ее значениями а
       A=new double*[size];
        for(int k=0;k!=size;++k)A[k]=new double[size];
        for(int i=0;i!=size;++i)for(int j=0;j!=size;++j)A[i][j]=a;
   }
}


Далее в програмке идет создание объекта matrix

Код

double q=2; matrix bad(q); 
// Или так
matrix bad();


И на этом моменте програмка останавливается.
Кто-нибудь может подсказать, в чем проблема?

Автор: Neitron 12.12.2005, 14:15
Первое что бросается в глаза это отсутсвие точки с запятой в конструкторе по умолчанию.
Код

int size=a;

Приравнивашь инту доубль.

Автор: pablo 12.12.2005, 14:16
Во первых: Конвертация из double в int, это никчему хорошему не приведёт, далее, что говорит программа или отладчик при остановке ?

Автор: FTK 12.12.2005, 14:27
На самом деле, даже если просто написать
Код

int size=2; //Чтоб квадратную создал.....

И поставив ; после конструктора по умолчанию, не работает.
Программа останавливается, ничего не говорит, на клаву не реагирует. (Консоль до этой строчки выводит все нормально, и потом стоп.)

Автор: pablo 12.12.2005, 14:41
Код

#include <iostream>
#include <new>

using namespace std;

class matrix
{
double **A;
int size;
public:
matrix (){A=0;} //Òèïà êîíñòðóêòîð óìîë÷àíèÿ
 matrix(const int &a)     // Êîíñòðóêòîð, êîòîðûé äîëæåí ñîçäàòü êâàäðàòíóþ ìàòðèöó àxa 
   {    int size=a;  //è çàïîëíèòü åå çíà÷åíèÿìè à
       A=new double*[size];
        for(int k=0;k!=size;++k)A[k]=new double[size];
        for(int i=0;i!=size;++i)for(int j=0;j!=size;++j)A[i][j]=a;
   }
};

int main()
{
    matrix a(2);
    return 0;
}


всё компилится и работает на 6 вижуал студии

Автор: FTK 12.12.2005, 14:48
У меня тож 6 студия.
Но работать не хочет.
Отладчик тоже при подходе к этой строке останавливается, ошибок не пишет, матрицу не создает, на f11 и f10
не реагирует....

Автор: pablo 12.12.2005, 15:00
Код

#include <iostream>
#include <new>

using namespace std;

class matrix
{
    double **A;
    int size;
public:
    matrix (){A=0;} 
    matrix(const int &a)      
    {
        int size = a;
        
        A = new double*[size];

        for(int k = 0; k!=size; ++k)
            A[k] = new double[size];

        for(int i = 0;i != size; ++i)
        {
            for(int j=0;j != size ;++j)
            {
                A[i][j]=a;
                cout << A[i][j];
            }
            cout << endl;
        }
    }
};
int main()
{
    matrix a(10);
    matrix b;
    
    return 0;
}


Запусти увидиш вывод: матрица 10х10 с цифрами 10, всё 100% работает

Автор: FTK 12.12.2005, 19:45
pablo
Спасибо за помощь, но это я тут стормозил.
Проблема-то не в конструкторе...
Код

matrix compute(char *in, int &a)
    { 
                    if(!A.readf(in)) 
        {
                                cout<<"Incorrect file"<<endl;
         matrix X(0);
         return  X;
        } 
                               //И там дальше не важно что


Он создает матрицу X(0), потом, перейдя к return, он вызывает конструктор копирования, неизвестно почему.
И на этом он и повисает. Сможешь помочь? smile

Добавлено @ 19:47
Да, и еще, кто нибудь знает, что это за ошибка?

"CXX0030: Error: expression cannot be evaluated"

Автор: FTK 12.12.2005, 21:24
Кто-нибудь знает, почему return может вызывать конструктор копирования??? smile

Автор: blackofe 12.12.2005, 22:39
Цитата(FTK @ 12.12.2005, 21:24)
Кто-нибудь знает, почему return может вызывать конструктор копирования??? smile

потому что ты создаешь новый объект из имеющегося. X - локальная переменная для функции compute() и будет уничтожена при выходе из области видимости (в нашем случае - из тела функции). чтобы функция вернула значение, значение переменной X копируется и возвращается. сама переменная X, как я уже сказал, при это помирает.
Добавлено @ 22:42
в дополнение к pablo я бы озаботился деструктором. в имплементации такая куча new и ни одного delete. как-то это неаккуратненько ;).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)