Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/40: Рейтинг темы: голосов - 40, средняя оценка - 4.70
27 / 27 / 18
Регистрация: 13.09.2014
Сообщений: 137

'operator =' must be a non-static member

26.10.2014, 01:37. Показов 7487. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
#include "stdafx.h"
#include <iostream>
using namespace std;
template <class T>
class BinaryMinHeap {
public:
    BinaryMinHeap() {}
    BinaryMinHeap(const T* &array, const size_t& _size);
    BinaryMinHeap(const BinaryMinHeap<T>& obj) {}
    BinaryMinHeap& operator=(const BinaryMinHeap<T>& obj); 
        //size = obj.size;
        //heap = new T[size];
        //for (size_t i = 0; i < size; ++i)
        //  heap[i] = obj.heap[i];
        //return *this;
    /*bool insert(T key);*/
private:
    T* heap = nullptr;
    size_t size = 0;
};
template <class T>
BinaryMinHeap<T>::BinaryMinHeap(const T* &array, const size_t& _size) {
    size = _size;
    heap = new T[size];
    for (size_t i = 0; i < size; ++i)
        heap[i] = array[i];
}
template <class T>
BinaryMinHeap<T>::BinaryMinHeap& operator=(const BinaryMinHeap& obj) {
    size = obj.size;
    heap = new T[size];
    for (size_t i = 0; i < size; ++i)
        heap[i] = obj.heap[i];
    return *this;
}
VS выдает несколько ошибок, одна из них:
'operator =' must be a non-static member
Помещаю описание 'operator =' внутрь класса - все работает. Из-за чего так?
//
И еще, как правильней
C++
1
BinaryMinHeap<T>& operator=(const BinaryMinHeap<T>& obj);
или
C++
1
BinaryMinHeap& operator=(const BinaryMinHeap& obj);
внутри класса и вне класса. Напишите, пожалуйста.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.10.2014, 01:37
Ответы с готовыми решениями:

Invalid use of member in static member function
Здравствуйте! У меня есть класс: class foo{ public: foo(); ~foo(); int m_number;

Operator()' is not a member of 'const char*
Добрый день. компилятор выдает ошибку qobject.h:319: ошибка: 'operator()' is not a member of 'const char*' return...

Ошибка: invalid use of non-static member function
#include &lt;iostream&gt; using namespace std; class fraction { fraction(double var_sum) {

12
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
26.10.2014, 01:43
Цитата Сообщение от notemac Посмотреть сообщение
VS выдает несколько ошибок,
В каких строках разве не пишет?
Вот это?
C++
1
T* heap = nullptr;
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,221
26.10.2014, 01:43
Лучший ответ Сообщение было отмечено notemac как решение

Решение

Ну так а имя класса в определении вашего оператора куда пропало? Надо указывать имя класса: BinaryMinHeap<T>::operator = и т.д.
1
27 / 27 / 18
Регистрация: 13.09.2014
Сообщений: 137
26.10.2014, 02:00  [ТС]
Спасибо, вот так заработало
C++
1
2
3
4
5
6
7
8
template <class T>
BinaryMinHeap<T>& BinaryMinHeap<T>::operator=(const BinaryMinHeap<T>& obj) {
    size = obj.size;
    heap = new T[size];
    for (size_t i = 0; i < size; ++i)
        heap[i] = obj.heap[i];
    return *this;
}
Добавлено через 51 секунду
alsav22, что значит "вот это"?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
26.10.2014, 02:08
Цитата Сообщение от notemac Посмотреть сообщение
что значит "вот это"?
Уже не важно (у меня это не компилируется, не та поддержка С++11).
Реализация оператора присваивания неправильно сделана: старая память не освобождается.
0
27 / 27 / 18
Регистрация: 13.09.2014
Сообщений: 137
26.10.2014, 02:13  [ТС]
alsav22, так если есть obj1, obj2.
Присваиваем obj1=obj2. Зачем obj2 очищать? (Так обычно делают, чтобы не было одинаковых объектов?)
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
26.10.2014, 02:17
Цитата Сообщение от notemac Посмотреть сообщение
Зачем obj2 очищать?
Не obj2, а obj1(он оператор присваивания вызывает), иначе утечка памяти.
1
27 / 27 / 18
Регистрация: 13.09.2014
Сообщений: 137
26.10.2014, 02:59  [ТС]
alsav22, точно!!!! Спасибо.

alsav22, как правильно исправить?
Error 1 error C2664: 'BinaryMinHeap<int>::BinaryMinHeap(const BinaryMinHeap<int> &)' : cannot convert argument 1 from 'int [7]' to 'int *&'
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
#include "stdafx.h"
#include <iostream>
using namespace std;
template <class T>
class BinaryMinHeap {
public:
    BinaryMinHeap() {}
    BinaryMinHeap(const T* &array, const size_t& _size);
    BinaryMinHeap(const BinaryMinHeap<T>& obj) {};
    BinaryMinHeap<T>& operator=(const BinaryMinHeap<T>& obj); 
    void siftup();//просеить вверх
    void insert(const T& key);
private:
    T* heap = nullptr;
    size_t size = 0;
};
template <class T>
BinaryMinHeap<T>::BinaryMinHeap(const BinaryMinHeap<T>& obj) {
    size = obj.size;
    heap = new T[size];
    for (size_t i = 0; i < size; ++i)
        heap[i] = obj.heap[i];
}
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0, "Rus");
    int mas[] = {2,1,40,9,20,50,1};
    BinaryMinHeap<int> one(mas, sizeof(mas)/sizeof(mas[0]));
        
    cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());
    cin.get();
    return 0;
}
Добавлено через 14 минут
Заработало через указатель:
C++
1
 BinaryMinHeap(const T* array, const size_t& _size);
Все же интересует, как передать по ссылке, чтобы копия не передавалась?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,221
26.10.2014, 03:27
Лучший ответ Сообщение было отмечено notemac как решение

Решение

Цитата Сообщение от notemac Посмотреть сообщение
Все же интересует, как передать по ссылке, чтобы копия не передавалась?
О какой "копии" вы говорите??? Массивы в С++ невозможно передать по копии. В вашем случае вы передаете просто указатель. Никаких копий. Также передавать значение типа 'size_t' по ссылке - полнейшая бессмыслица. 'size_t' - скалярный тип. Его надо передавать по значению, без извращений с ненужными ссылками.

У вас в оригинальном (неправильном) коде ссылка объявлена как ссылка на указатель, а не ссылка на массив. Это, понятно, работать не будет. Правда можно было заменить тип параметра на 'const T* const &array' и все бы "заработало", но это такая же бессмыслица, как передача 'size_t' по ссылке. Не занимайтесь ерундой.

Далее. Если уж вам очень хочется, то тип "массив" можно передавать по ссылке именно на весь массив, но только если его размер фиксирован на стадии компиляции. Например, если бы вы знали, что все массивы у вас будут размера именно 7, то конструктор можно было бы объявить так

C++
1
BinaryMinHeap(const T (&array)[7]);
Если же размер является константой времени компиляции, но может быть разным, то выкрутиться со ссылкой можно только сделав конструктор шаблонным и дополнительно запараметризовав его размером массива

C++
1
2
template <int N>
BinaryMinHeap(const T (&array)[N]);
Соответственно внешнее определение для такого конструктора будет делаться как

C++
1
2
3
4
5
template <class T> template <int N>
BinaryMinHeap<T>::BinaryMinHeap<N>(const T (&array)[N])
{
  ...
}
Ну а если размер массива может быть не известен на стадии компиляции, то ссылки на массив вам тут не помогут. И придется либо делать как у вас сейчас, либо делать конструктор через пару итераторов, как в std::vector (последнее, кстати, может быть даже и лучшая идея).
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
26.10.2014, 03:30
Цитата Сообщение от notemac Посмотреть сообщение
Все же интересует, как передать по ссылке, чтобы копия не передавалась?
C++
1
2
3
    int mas[] = {2,1,40,9,20,50,1};
    const int* p = mas;
    BinaryMinHeap<int> one(p, sizeof(mas)/sizeof(mas[0]));
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,221
26.10.2014, 04:05
В моем примере с шаблонным конструктором, параметризованным через 'N', уместнее использовать не 'int', а тип 'size_t' для 'N'.
1
27 / 27 / 18
Регистрация: 13.09.2014
Сообщений: 137
26.10.2014, 04:34  [ТС]
TheCalligrapher, передаю по ссылке, чтобы сэкономить память размером с sizeof(size_t) . Получается это извращенство...
TheCalligrapher, есть разница между
C++
1
template <class T> template <int N>
и
C++
1
template <class T, size_t N>
?
Спасибо обоим, сейчас вникнусь и еще пометки сделаю про указатели обязательно!)
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,221
26.10.2014, 06:24
Лучший ответ Сообщение было отмечено notemac как решение

Решение

Цитата Сообщение от notemac Посмотреть сообщение
TheCalligrapher, передаю по ссылке, чтобы сэкономить память размером с sizeof(size_t) . Получается это извращенство...
Дело тут не только в том, что экономится мало памяти, а в том, что на самом деле вообще ничего не экономится. Когда ссылка используется в качестве параметра функции, она реализуется компилятором как обыкновенный замаскированный указатель. На современных платформах с "плоской" моделью памяти размер типа size_t совпадает с размером указателя. Поэтому передаете вы в обоих случаях одно и тоже количество данных. Никакой экономии нет.

При этом доступ к размеру, переданному через ссылку, будет производится через этот замаскированный указатель, что потенциально медленнее, чем прямой доступ к локальной копии. Т.е. вы не только не экономите память, вы еще и зачем-то потенциально теряете в эффективности кода.

(Оптимизатор во многих случаях сможет предотвратить эту потерю эффективности, но, еще раз, пользы или какой-то экономии от такого способа передачи все равно не будет.)

Цитата Сообщение от notemac Посмотреть сообщение
TheCalligrapher, есть разница между
C++
1
template <class T> template <int N>
и
C++
1
template <class T, size_t N>
?
Разница, конечно, есть. Ваш шаблон класса ничего не должен знать про это 'N'. Ваш шаблон класса зависит только от 'T'. Поэтому ваш шаблон класса всегда будет только 'template <class T>' (современная спецификация языка, кстати, настойчиво рекомендует 'template <typename T>'). А конструктор в моем примере является самостоятельным шаблоном, который дополнительно параметризован вот этим 'N' независимо от шаблона класса. Поэтому он требует своего, отдельного 'template <size_t N>'. Эти две параметризации не нужно сливать в одну.

Однако все это справедливо если вы хотите, чтобы ваш класс 'BinaryMinHeap<T>' мог содержать внутри массивы разного, неизвестного на стадии компиляции размера. Т.е. именно так, как это у вас сделано сейчас. Также ваша нынешняя реализация позволяет вам, при необходимости, увеличить размер массива на лету, т.е. сделать delete[] на старый массив и сделать new[] нового массива другого размера. (Я не знаю, нужно ли вам это или нет, но такая возможность потенциально имеется.)

Но если вы в один прекрасный момент решите, что вам вся эта гибкость размеров не нужна и что размеры всех 'BinaryMinHeap<T>' будут известны заранее на стадии компиляции и никогда не будут меняться в процессе выполнения, тогда вы действительно можете сделать величину 'N' параметром всего шаблона класса, т.е. сделать именно вот так

C++
1
2
3
4
template <class T, size_t N> 
class BinaryMinHeap
{
   ...
При этом у вас отпадет необходимость динамически выделять память для массива - вы сможете просто объявить

C++
1
T heap[N];
внутри вашего класса и т.п. (Это будет уже практически 'std::array': http://en.cppreference.com/w/cpp/container/array)

Но тут уже вам виднее, что именно вам нужно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.10.2014, 06:24
Помогаю со студенческими работами здесь

An object reference is required to access non static member
Есть код на unity, который должен при входе в коллайдер добавлять к дамагу дамаг от огня. При попытке присвоить значению damage урон от...

Массив в структуре. invalid use of non-static data member
Добрый день. Есть структура, понадобилось добавить в неё массив с дин. размером. struct MyStruct { // ... uint16_t...

Ошибка в книге extra qualification 'Critter::' on member 'operator='
Есть книга - Майкл Доутсон &quot;Изучаем С++ через программирование игр&quot;. В книге есть код который не работает. Код тестировался на...

Массив в классе. Ошибка error: invalid use of non-static data member
class MyClass { // ... private: int mont; // число дней в месяце int days; };Возвращает ошибку error: invalid use...

error C2352: 'OGLDevice::CreateGLWindow' : illegal call of non-static member function
Когда подключаю DLL и компилирую код выдает эту ошибку. В чем проблема? error C2352: 'OGLDevice::CreateGLWindow' : illegal call of...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru