Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433

Как исправить ошибки

24.09.2019, 22:07. Показов 2278. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <memory>
 
using std::unique_ptr;
using std::make_unique;
using std::cout;
 
typedef unsigned int uint;
 
class Line
{
    unique_ptr<CMatrix> owner;
    uint row;
public:
    /*Constructor*/
    Line(CMatrix& Matrix, uint i) : owner(&Matrix), row(i) { }
    /*Operator overload*/
    double operator[](uint columns) { return owner->cell(row, columns); }
};
 
class CMatrix
{
    uint m;
    uint n;
public:
    unique_ptr<unique_ptr<double[]>[]> ptrMatrix;
    /*Constructor*/
    CMatrix(uint rows, uint columns) :
        m(rows),
        n(columns),
        ptrMatrix(make_unique<unique_ptr<double[]>[]>(m)) // создание m указателей
    {
        for (uint i = 0; i < rows; i++) {
            ptrMatrix[i] = make_unique<double[]>(n); // создание n элементов double
        }
    }
    /*Method*/
    double& cell(uint row, uint columns) { };
    /*Operator overload*/
    Line operator[](uint row) { return Line(*this, row); }
};
 
int main() {
    
    CMatrix A(5, 5);
    system("pause");
    return 0;
}
(12): error C2065: CMatrix: необъявленный идентификатор
(12): error C2923: std::unique_ptr: "CMatrix" не является допустимым аргументом типа шаблон для параметра "_Ty"
(12): error C2903: default_delete: символ не является ни классом шаблон, ни функцией шаблон
(12): error C3203: "default_delete": неспециализированный класс шаблон нельзя использовать в качестве аргумента шаблон для параметра шаблон "_Dx", требуется действительный тип
(16): error C2061: синтаксическая ошибка: идентификатор "CMatrix"
(16): error C2065: Matrix: необъявленный идентификатор
(16): error C2065: i: необъявленный идентификатор
(16): fatal error C1903: не удается восстановить после предыдущих ошибок; остановка компиляции

Как их исправить.
Первое что не знаю, если есть такой класс матрицы с конструктором с параметрами, то как сделать на него уник поинтер и обычный поинтер? Передавать аргументы конструктору или писать конструктор по умолчанию или всё правильно написано?
Аналогичный вопрос с CMatrix& Matrix.
Насколько понимаю основная ошибка в этих строках
C++
1
unique_ptr<CMatrix> owner;
и
C++
1
Line(CMatrix& Matrix, uint i) : owner(&Matrix), row(i) { }
Добавлено через 5 минут
Или тут проблема в том, что класс Line банально не видит класса CMatrix ?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.09.2019, 22:07
Ответы с готовыми решениями:

Как исправить ошибки?
есть три ошибки: 1.выход за приделы массива 2.решётка сдвигается только когда двигается игрок 3.как сделать скорость движения...

Как исправить ошибки?
Задание было :Доделать код,что бы был конструктор с параметром учитель и со своими set- get- функциями...Может опять где чего намудрил...

Как исправить ошибки?
class CRageBot { public: bool Run(); bool Autowall( CBaseEntity* other, const Vector&amp; startpos, const Vector&amp; endpos, float*...

4
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
24.09.2019, 22:59
Лучший ответ Сообщение было отмечено Timurs как решение

Решение

Определять надо после класса CMatrix
C++
1
double Line::operator[](uint columns) { return owner->cell(row, columns); }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <memory>
 
using std::unique_ptr;
using std::make_unique;
using std::cout;
 
typedef unsigned int uint;
 
class CMatrix;
 
class Line
{
    unique_ptr<CMatrix> owner;
    uint row;
public:
    /*Constructor*/
    Line(CMatrix& Matrix, uint i) : owner(&Matrix), row(i) { }
    /*Operator overload*/
    double operator[](uint);
};
 
class CMatrix
{
    uint m;
    uint n;
public:
    unique_ptr<unique_ptr<double[]>[]> ptrMatrix;
    /*Constructor*/
    CMatrix(uint rows, uint columns) :
        m(rows),
        n(columns),
        ptrMatrix(make_unique<unique_ptr<double[]>[]>(m)) // создание m указателей
    {
        for (uint i = 0; i < rows; i++) {
            ptrMatrix[i] = make_unique<double[]>(n); // создание n элементов double
        }
    }
    /*Method*/
    double& cell(uint row, uint columns) {  };  //!!!!!!!!!! Ничего не возвращает, алё
    /*Operator overload*/
    Line operator[](uint row) { return Line(*this, row); }
};
                      
double Line::operator[](uint columns) { return owner->cell(row, columns); }                      
 
int main() {
    
    CMatrix A(5, 5);
    return 0;
}
1
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433
24.09.2019, 23:54  [ТС]
Peoples, спасибо! По методу ячейки в курсе, не писал пока ещё
0
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433
25.09.2019, 01:38  [ТС]
Peoples, программа и работает, и валится одновременно. Вылет во вложении.
Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include <memory>
 
using std::unique_ptr;
using std::make_unique;
using std::cout;
 
typedef unsigned int uint;
 
class CMatrix;
 
class Line
{
    unique_ptr<CMatrix> owner;
    uint row;
public:
    /*Constructor*/
    Line(CMatrix& Matrix, uint i) : owner(&Matrix), row(i) { ; }
    /*Operator overload*/
    double operator[](uint column);
};
 
class CMatrix
{
    uint m;
    uint n;
    double x;
public:
    unique_ptr<unique_ptr<double[]>[]> ptrMatrix2D;
    /*Constructor*/
    CMatrix(uint rows, uint columns) :
        m(rows),
        n(columns),
        x(0.0),
        ptrMatrix2D(make_unique<unique_ptr<double[]>[]>(m)) // создание m указателей
    {
        
        for (uint i = 0; i < rows; i++) {
            ptrMatrix2D[i] = make_unique<double[]>(n); // создание n элементов double
            for (uint j = 0; j < columns; j++) {
                ptrMatrix2D[i][j] = x;
                cout << ptrMatrix2D[i][j] << "\t";
                x++;
            }
            cout << "\n";
        }
        cout << "\n";
    }
    /*Method*/
    double& cell(uint row, uint column) { return ptrMatrix2D[row][column]; }
    /*Operator overload*/
    Line operator[](uint row) { return Line(*this, row); }
};
 
double Line::operator[](uint column) { return owner->cell(row, column); }
 
int main() {
    
    CMatrix A(5, 5);
    cout << "Test Matrix: " << A[0][4] << "\n";
    system("pause");
    return 0;
}
С чем может быть связано?
File: minkernel\crts\ucrt\src\appcrt\heap\debu g_heap.cpp
Line: 908
Expression: is_block_type_valid(header->_block_use)
Миниатюры
Как исправить ошибки  
0
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433
25.09.2019, 06:05  [ТС]
Если 60-ую строку закомментить, то всё хорошо. Значит проблема с отработкой [ ][ ]

Добавлено через 3 часа 55 минут
Если я правильно понимаю, то объект A один, а уник поинтера после A[0][4] на него 2 (ptrMatrix2D и owner), и когда из мейна выходим один из них удаляет A, а второй ссылается на уже удаленный, и в этот момент и вылетает ошибка.

Добавлено через 24 минуты
Соответственно надо делать вместо unique_ptr<CMatrix> owner это CMatrix* owner без деструктора, и всё должно работать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.09.2019, 06:05
Помогаю со студенческими работами здесь

Как исправить ошибки
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; using namespace std; ...

Как исправить ошибки
Menu.h #include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include &lt;dos.h&gt; #include &lt;process.h&gt; #include &lt;string.h&gt; #define LEFT 75 ...

как исправить ошибки
помогите исправить ошибки в коде Правила форума

Как исправить ошибки?
Вот код программы. Помогите исправить ошибки. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;windows.h&gt; #include...

Как исправить ошибки в коде
Не могу понять что не так. Помогите пожалуйста. #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;iomanip&gt; using namespace std; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru