Я хочу переопределить скобки двух операторов "[]" и "=" на языке C++ и использовать их одновременно. На самом деле я хочу создать динамический массив и использовать его как обычные массивы в языке C++. Например, выполняйте присваивание как обычные массивы. Например:
MyDynamicArray myarray;
myarray[0] = 1;
myarray[1] = 7;
myarray[2] = 3;
Что важно для меня, так это переопределение операторов присваивания и скобок и их одновременное использование в моем коде.
Мой файл dynamicarray.h:
#include <iostream>
template<typename anyType>
class DynamicArray {
private:
Linear_Singly_Linked_List<anyType> *D_Arr;
bool assignmentflag;
public:
DynamicArray() {
D_Arr = new Linear_Singly_Linked_List<anyType>;
assignmentflag = false;
}
unsigned int GetNumberOfNodes() {
return D_Arr->get_number_of_nodes();
}
void Store(unsigned int index, anyType object);
anyType operator = (anyType object) {
if (assignmentflag)
D_Arr->append(object);
}
anyType operator [] (unsigned int index) {
return D_Arr->display_of_data_node(index + 1);
assignmentflag = true;
}
};
template<class anyType> void DynamicArray<anyType>::Store(unsigned int index, anyType object) {
if (D_Arr->get_number_of_nodes() == index) {
D_Arr->append(object);
}
else if (index >= 0 && index < D_Arr->get_number_of_nodes()) {
D_Arr->replacement(index+1,object);
}
else if (index > D_Arr->get_number_of_nodes()) {
for (unsigned int i = D_Arr->get_number_of_nodes() ; i < index ; i++) {
anyType nul = NULL;
D_Arr->append(/*NULL*/nul);
}
D_Arr->append(object);
}
}
и мой файл dynamicarrayTester.cpp:
#include <iostream>
#include "dynamicarray.h"
using namespace std;
int main() {
DynamicArray<int> a;
a[0] = 27;
a.Store(0,-7);
a.Store(1,-5);
a.Store(2,3);
a.Store(3,2);
a[3] = 7;
cout << a[0] << endl;
cout << a[1] << endl;
cout << a[2] << endl;
cout << a[3] << endl;
}
В той части, где a[0] = 27;
я получаю сообщение об ошибке «выражение должно быть модифицируемым lvalue».
Изобретать std::vector
для удовольствия и прибыли? Связный список — ужасная идея. Не. В любом случае вы не должны динамически выделять сам список. Ваш класс нарушает закон 3/5/0, который буквально является первой вещью, которую должен выучить любой программист на C++.
Дорогой друг [н. м., спасибо за совет. Я начинающий. Я знаю, что использование связанного списка в этом проекте — плохая идея и изобретать велосипед, но я делаю этот проект в качестве домашнего задания. Пожалуйста, не вини меня. Плохое поведение вызывает раздражение и дискомфорт. Но большое спасибо за вашу помощь. Я не знаю правила 3/5/0. Пожалуйста, пришлите мне ссылку на разъяснение этого закона. Спасибо за ваше руководство.
operator[]()
и [предпочтительно, хотя технически необязательно в вашем использовании] operator=()
должны возвращать ссылку (на существующий элемент вашего DynamicArray
). Они оба возвращаются по значению, поэтому результат operator[]()
нельзя использовать в качестве lvalue (размещается в левой части присваивания). Кроме того, присваивание AssignmentFlag = true
в operator[]()
никогда не выполняется, поскольку оно выполняется сразу ПОСЛЕ оператора return — поток выполнения никогда не достигает его.
Вам нужно перегрузить operator[]
, чтобы вернуть ссылку. Например.
#include <iostream>
template <typename T>
class Arr {
T *data;
std::size_t size;
public:
Arr(std::size_t size) : data(new T[size]), size(size) { }
~Arr() { delete [] data; }
T & operator[](std::size_t i) {
return data[i];
}
};
int main() {
Arr<int> arr{10};
arr[3] = 42;
std::cout << arr[3] << std::endl;
}
Сообщение об ошибке вполне понятно. Чтобы разрешить изменения, вы должны вернуть ссылку.