eugrita
							
								Помогающий 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 «  : 22-03-2010 08:58 »   | 
								
								 | 
							  
							 
							Делаю класс комплексн чисел на Delphi . Вот заготовка unit Complex; interface Type cmplx=record  re,im: Real; end; Type TComplex=class private   R,fi: real;  public   z: cmplx;   function AddC(z1,z2:Cmplx): Cmplx; //вставка в конец   constructor Create(xx:real;yy:real); end; cmp=^TComplex; implementation function TComplex.AddC(z1,z2:Cmplx): Cmplx; //вставка в конец  begin   RESULT.re:=z1.re+z2.re;   RESULT.im:=z1.im+z2.im;  end; constructor TComplex.Create(xx:real;yy:real);  begin   New(cmp);   inherited create;     // cmp^.z.x :=xx;  cmp^.z.y :=yy; {так не компилится}       self.z.re := xx;  {так компилится, но валится при выполнении}  end; end.
  --------------------------------- Проблема с конструктором. Полагаю при создании класса надо выделить память. Для этого ввел указатель на класс cmp и вызываю New(cmp) Проблема, что потом не могу через указатель обратиться к членам  данных re, im (чтобы присвоить им значения) - не пропускает компилятор
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							zubr
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #1 : 22-03-2010 09:06 »   | 
								
								 | 
							  
							 
							Не понял зачем вообще cmp. Для обращения к собственному объекту - ключевое слово Self. Убери из кода cmp=^TComplex; и все с ним связанное. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							eugrita
							
								Помогающий 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #2 : 22-03-2010 09:22 »   | 
								
								 | 
							  
							 
							Как уже говорил, такой вариант конструктора валится при выполнении constructor TComplex.Create(xx:real;yy:real);  begin //  New(cmp);   inherited create;    self.z.re := xx;  {так компилится, но валится при выполнении}   self.z.im := yy;  end; 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Oldy
							
						 | 
						
							
								  | 
								
									
									 « Ответ #3 : 22-03-2010 09:48 »   | 
								
								 | 
							  
							 
							Что делает Inherited create? От чего вы его (свой класс) унаследовали? 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							С уважением, Oldy. 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							eugrita
							
								Помогающий 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									«  Ответ #4 : 22-03-2010 09:56 »    | 
								
								 | 
							  
							 
							хорошо, давайте выбросим - только все равно валится на операторе присвоения Полагаю как раз из-за отсутствия выделения памяти классу 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							zubr
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #5 : 22-03-2010 10:04 »   | 
								
								 | 
							  
							 
							eugrita, покажи как ты создаешь объект класса TComplex. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Вад
							
						 | 
						
							
								  | 
								
									
									 « Ответ #6 : 22-03-2010 10:23 »   | 
								
								 | 
							  
							 
							 cmp^.z.x :=xx;  cmp^.z.y :=yy
  конечно, не компилится: как минимум, откуда у z возьмутся поля x и y?  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							eugrita
							
								Помогающий 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #7 : 22-03-2010 11:07 »   | 
								
								 | 
							  
							 
							var c1,c2,c: TComplex; begin   c1.Create(1,2);   c2.Create(3,1);
  а по поводу не компилится извините неточно написал операторы:  правильно будет  cmp^.z.re :=xx;  cmp^.z.im :=yy; но компилятор говорит на это: поставив курсор правее ^    ( expected , but ^ found
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							zubr
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #8 : 22-03-2010 11:09 »   | 
								
								 | 
							  
							 
							c1 := TComplex.Create(1, 2); c2 := TComplex.Create(3, 1); 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							eugrita
							
								Помогающий 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #9 : 22-03-2010 11:18 »   | 
								
								 | 
							  
							 
							да спасибо.Так прошло А что тот подход с принудительным выделением памяти указателю неправилен в принципе?
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							x77
							
								Модератор
								
								 
								  Offline
								Пол:   
								
								меняю стакан шмали на обратный билет с Марса.
								
								
								
								
								
							  
						 | 
						
							
								  | 
								
									
									 « Ответ #10 : 22-03-2010 15:57 »   | 
								
								 | 
							  
							 
							eugrita, есть классы - это, грубо говоря, типы. есть экземпляры класса, или объекты, которые, грубо говоря, являются переменными данного типа. любой экземпляр класса является указателем изначально. для него автоматически выделяется память в конструкторе, ваша задача - выделить память под другие объекты, объявленные именно в вашем классе.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							eugrita
							
								Помогающий 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #11 : 22-03-2010 16:19 »   | 
								
								 | 
							  
							 
							Да. Понятно - общий принцип создания классов во всех языках. А вот добавление к рассматриваемому примеру. Тоже несовсем мне понятное. 2 реализации метода сложения комплексн чисел (объявлены с overload) function TComplex.AddC(z2: TComplex): TComplex; //âñòàâêà â êîíåö  begin   RESULT.z.re:=Self.z.re+z2.z.re;   RESULT.z.im:=Self.z.im+z2.z.im;  end;  function TComplex.AddC(z1:TComplex; z2:TComplex): TComplex;  begin     RESULT.z.re:=z1.z.re+z2.z.re;      RESULT.z.im:=z1.z.im+z2.z.im;  end; вызов каждого метода  var c1,c2,c: TComplex; begin   c1:= TComplex.Create(1,2); c2:= TComplex.Create(3,1); c:= TComplex.Create;   c1.RFI();    c:=c.AddC(c1,c2);   c:=c1.AddC(c2);//здесь почему-то валится В обоих случаях методы вызываются от реально созданного, т.е. размещенного в памяти объекта c и c1 1)Почему валится? 2)Насколько я понимаю, что в отличие от вызова конструктора метод нельзя вызвать так: TComplex.AddC(c1,c2);  (по аналогии скажем со static-методами в C++). (Хотя по умочанию методы класса в Delphi - статические) 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							x77
							
								Модератор
								
								 
								  Offline
								Пол:   
								
								меняю стакан шмали на обратный билет с Марса.
								
								
								
								
								
							  
						 | 
						
							
								  | 
								
									
									 « Ответ #12 : 22-03-2010 16:35 »   | 
								
								 | 
							  
							 
							1) странно, что только на втором вызове валится. должен всегда валиться. потому что результат метода - TComplex - у вас не создаётся нигде, а ведь это такой же объект, как и все прочие. 2) для того, чтобы вызывать метод класса без создания экземпляра класса, его надо объявлять, как метод класса    есть такая штука - class function (или class procedure). конструктор тоже является методом класса, хотя и неявно.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							eugrita
							
								Помогающий 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #13 : 22-03-2010 16:53 »   | 
								
								 | 
							  
							 
							так правильно? class function TComplex.Add(z1:TComplex; z2:TComplex): TComplex;  begin     RESULT.Create;     RESULT.z.re:=z1.z.re+z2.z.re;     RESULT.z.im:=z1.z.im+z2.z.im;  end; и вызов c:=TComplex.Add(c1,c2);     c.XY(); {без предварительного создания c}
  а вот попытка преобразования 2 варианта метода Add в class function - неудачна class function TComplex.Add(z2: TComplex): TComplex;  begin   RESULT.Create;   RESULT.z.re:=Self.z.re+z2.z.re;   RESULT.z.im:=Self.z.im+z2.z.im;  end; компилятор говорит, что для Self переменная z стала недоступна (ранее была в том же теле функции доступна!) 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							x77
							
								Модератор
								
								 
								  Offline
								Пол:   
								
								меняю стакан шмали на обратный билет с Марса.
								
								
								
								
								
							  
						 | 
						
							
								  | 
								
									
									 « Ответ #14 : 22-03-2010 16:56 »   | 
								
								 | 
							  
							 
							1) RESULT.Create; - вот смотрите, вы обращаетесь к методу объекта, которого ещё нет. это всегда даст ошибку. создать объект может только сам класс: Result := TComplex.Create.
  2) переменная Self недоступна, потому что это указатель на объект. а у вас нет объекта - у вас есть только класс. т.е. как бы тип объекта.
  я не совсем уверен, что для вашей задачи необходимы class function.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 | 
	 |