Есть функция:
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);
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
24
9 лет назад
0
я, конечно, давным давно ничего не писал на c++, но разве оператор this там не работает?
0
29
9 лет назад
Отредактирован alexprey
0
Да, можно юзать this
class SomeClass {
private:
	int x, y, z;
public:
	void setX(int x) {
		this->x = x;
	}
}
0
20
9 лет назад
0
но мне надо не одно значение класса присваивать, а все разом, как в примере с newOne и newOneFunction
все значения одного класса всем значениям другого
0
29
9 лет назад
0
Praytic, ты хочешь скопировать все значения одного объекта в другой объект?
0
20
9 лет назад
0
да
0
29
9 лет назад
0
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);
Принятый ответ
0
20
9 лет назад
Отредактирован Praytic
0
Спасибо. Кстати, почему нельзя так писать?
	// Копирование
	void Copy(const SomeClass obj) {
		x = obj.x;
		y = obj.y;
		z = obj.z;
	}
0
29
9 лет назад
0
Praytic, можно, просто лень было писать дважды. Ну и собственно с указателями нужно их разыменовывать при обращении к методам и полям класса с помощью такого оператора ->
0
20
9 лет назад
Отредактирован Praytic
0
alexprey:
Praytic, можно, просто лень было писать дважды. Ну и собственно с указателями нужно их разыменовывать при обращении к методам и полям класса с помощью такого оператора ->
Что значит писать дважды? Это я просто переписал вашу функцию без использования указателей. По моему мнению она работает точно также (только копию класса создает), но люди по-умнее говорят, что так писать нельзя и нужно по-больше указателей использовать. Почему?
0
9
9 лет назад
0
Если тебе нужно создать полный клон по полям, для этого хорошо подходит конструктор копирования по умолчанию - это конструктор копирования который заранее определен для класса.
Он вызывается в двух случаях:
MyClass A(...);
My Class B(A);
MyClass A(...);
MyClass B = A;		//здесь это не операция присваивания, а копирование 
0
20
9 лет назад
0
Ну так почему правильно писать так:
 void setFunc(int a, int b, char c) {
		this->someInt1 = a;
		this->someInt2 = b;
		this->someChar = c;
	}
а не так?
 void setFunc(int a, int b, char c) {
		someInt1 = a;
		someInt2 = b;
		someChar = c;
	}
А все, понял.
1
9
9 лет назад
Отредактирован AsagiriGen
1
Правильно для чего? Эти 2 способа получения значений одинаковы, только в первом случае this используется явно(ты сам его ставишь), а во втором неявно(компилятор это и так делает для имен полей и методов данного объекта).
С точки зрения компилятора лучше второй, неявный способ. С точки зрения человека более удобно читать первый вариант, т.к. сразу видно, какие переменные относятся к объекту.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.