(C++) Присвоение класса внутри его функции
Есть функция:
void someClass::function(someClass newOne) { .... someClass newOneFunction = newOne; // простое присвоение переданного класса someClass newTwoFunction = ??? // как присвоить также класс, от которого вызывалась функция .... }
Вот ее вызов:
.... someClass test(1, 2, 'c'); someClass testFunction(3, 1, 'o'); test.function(testFunction); ....
Ответ
Praytic, ну тут есть два варианта, либо конструктор копирования, либо метод, который копирует значения в уже существующей.
class SomeClass { private: int x, y, z; public: // Конструктор копирования SomeClass(const SomeClass* obj) { this->Copy(obj); } // Копирование void Copy(const SomeClass* obj) { this->x = obj->x; this->y = obj->y; this->z = obj->z; } }
Как юзать:
SomeClass obj1 = .... // Конструктор копирования SomeClass obj2(&obj1); // Копирование obj1.Copy(&obj2);
Смотрите также:
Комментарии
- 1 (Текущая страница)
- 2
я, конечно, давным давно ничего не писал на c++, но разве оператор this там не работает?
Да, можно юзать this
class SomeClass { private: int x, y, z; public: void setX(int x) { this->x = x; } }
но мне надо не одно значение класса присваивать, а все разом, как в примере с newOne и newOneFunction
все значения одного класса всем значениям другого
да
Praytic, ну тут есть два варианта, либо конструктор копирования, либо метод, который копирует значения в уже существующей.
class SomeClass { private: int x, y, z; public: // Конструктор копирования SomeClass(const SomeClass* obj) { this->Copy(obj); } // Копирование void Copy(const SomeClass* obj) { this->x = obj->x; this->y = obj->y; this->z = obj->z; } }
Как юзать:
SomeClass obj1 = .... // Конструктор копирования SomeClass obj2(&obj1); // Копирование obj1.Copy(&obj2);
Спасибо. Кстати, почему нельзя так писать?
// Копирование void Copy(const SomeClass obj) { x = obj.x; y = obj.y; z = obj.z; }
Praytic, можно, просто лень было писать дважды. Ну и собственно с указателями нужно их разыменовывать при обращении к методам и полям класса с помощью такого оператора ->
Praytic, можно, просто лень было писать дважды. Ну и собственно с указателями нужно их разыменовывать при обращении к методам и полям класса с помощью такого оператора ->
Что значит писать дважды? Это я просто переписал вашу функцию без использования указателей. По моему мнению она работает точно также (только копию класса создает), но люди по-умнее говорят, что так писать нельзя и нужно по-больше указателей использовать. Почему?
Если тебе нужно создать полный клон по полям, для этого хорошо подходит конструктор копирования по умолчанию - это конструктор копирования который заранее определен для класса.
Он вызывается в двух случаях:
MyClass A(...); My Class B(A);
MyClass A(...); MyClass B = A; //здесь это не операция присваивания, а копирование
- 1 (Текущая страница)
- 2
Возможность добавлять комментарии была ограничена
CollectableItemData.cs
[CreateMenuItem(fileName = "newItem", menuName = "Data/Items/Collectable", order = 51]