Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2010, 00:37   #1
Shepard90
 
Регистрация: 16.12.2010
Сообщений: 3
По умолчанию Проблема с наследованием!

Добрового времени суток, форумчане!
возникла такая проблема.
Дело в том, что, непонятно каким образом, во всех методах производного класса, где входным параметром является объект того же класса при запуске конструктора-копировщика начинает выполняться конструктор по умолчанию базового класса и при этом в дальнейшем не выполняется конструктор потомка. Что за бред? Никак не догоню? Может косяк засел где-то глубже и поэтому я не могу его найти?

Код:
// Laba7.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#include <iostream>
using namespace std;

class Vector
{
protected:
  int *mass; // указатель на начало вектора
  int count; // количество элементов в векторе
 public:
  Vector();
  Vector(int i); // конструктор (назначен параметр по умолчанию)
  ~Vector(); // деструтор (не может иметь параметров)
 int item(int i) const; // возвращает указанный элемент
  void  assign(int i, int x); // назначение элемента
  int num(); // возвращает число элементов (inline)
  int norm(); // возвращает квадрат нормы вектора
};

Vector::Vector()
{
	count=2;// двойка здесь присвоена для того, чтобы программа, в ходе исправления, выполнялась без ошибок.
}
Vector::Vector(int i)
{ int j;
  count=i;
  mass=new int[count];
  for (j=0; j<count; j++)
  {
	  mass[j]=0;
  }
  cout << "vector created " << count << "\n";
}

Vector::~Vector()
{
 delete mass;
 cout << "vector destroyed\n";
}

int Vector::item(int i) const
{  if ((i>=0) && (i<count)) return *(mass+i);
  else {cout << "Error in vector::item"; return 0;}
}

void Vector::assign(int i, int x)
{
  if ((i>=0) && (i<count))  *(mass+i)=x;
  else cout << "Error in vector::assign";
}
int Vector::num() 
      { return count; }
int Vector::norm()
{ int i;
  int x=0;
  for (i=0; i<count; i++) x+=mass[i]*mass[i];
  return x;
}


class threeVector: public Vector
{
public:
	threeVector();//конструктор без параметрров
	threeVector(int *arr, int n);//передаю указатель на массив и длину массива
	threeVector(int n);//только длину
	~threeVector();//деструктор
	threeVector(threeVector &rhs);//конструктор-копировщик
	void OrtVectors(threeVector Vec1, threeVector Vec2);//проверка на ортогональность
	int SearchKomp();// поиск компонента вектора
	threeVector & operator=(threeVector &rhs);
	//int & operator[](int i);
	threeVector  operator*(threeVector &rhs);
	void SetKomp(int x,int i);
};
threeVector::threeVector():Vector()//конструктор
{
	int j;
  count=1;
  mass=new int[count];
  for (j=0; j<count; j++) *(mass+j)=0;
  cout << "threeVector created " << count << "\n";
}
threeVector::threeVector(int *arr, int n):Vector(n)//конструктор
{
	 mass=arr;
	 cout << "threeVector created " << count << "\n";
}
threeVector::threeVector(int n):Vector(n)//конструктор
{
	cout<<"threeVector created "<<count<<"\n";
}
threeVector::~threeVector()//деструктор
{
	cout<<"threeVector destroed\n";
}
threeVector::threeVector(threeVector &rhs) //коструктор-копировщик
{
	int i;
	mass=new int[count];
	for(i=0;i<count;i++)
	{
		mass[i]=rhs.item(i);
		
	}

}
void threeVector::OrtVectors(threeVector Vec1, threeVector Vec2)
{
	int i;
	int len;
	if(Vec1.num()<Vec2.num())
	{len=Vec1.num(); }
	else 
	{len=Vec2.num();}
	for(i=0;i<len;i++)
	{
		if(Vec1.item(i)==0 && Vec2.item(i)==1 || Vec1.item(i)==1 && Vec1.item(i)==0) 
		{
			printf("Vectors ortogonal\n");
			break;
		}
		else
		{
			if(i==len-1) printf("Vectors not ortogonal\n");
		}
	}
		
}

int threeVector::SearchKomp()
{
	int i;
	int len;
	int j;
	j=0;
	len=count;
	for(i=0;i<len;i++)
		if(mass[i]==2) j++;
	return j;
}
threeVector & threeVector::operator=(threeVector & rhs)
{
	int i;
	if(this==&rhs)
		return *this;
	for(i=0;i<count;i++)
		mass[i]=rhs.item(i);
	return *this;
}
//int & threeVector::operator[](int i)
//{
  //if ((i>=0) && (i<count)) return mass[i];
  //else {cout << "Error in vector::item"; return mass[0];}
//}
threeVector threeVector::operator*(threeVector &rhs)
{
	int i;
	threeVector Vec(count);
	for(i=0;i<count;i++)
	{
		if(mass[i]<=rhs.item(i))
		{
			Vec.SetKomp(mass[i],i);
		}
		else
		{
			Vec.SetKomp(rhs.item(i),i);
		}
	}
	return Vec;
}
void threeVector::SetKomp(int x,int i)
{
	mass[i]=x;
}



int _tmain(int argc, _TCHAR* argv[])
{
	threeVector V1(2),V2(2),V3(2);
	V1.SetKomp(2,0);
	V1.SetKomp(0,1);
	V2.SetKomp(2,0);
	V2.SetKomp(2,1);
	V3=V1*V2;
	cout<<V1.item(0)<<endl;
	cout<<V1.item(1)<<endl;
	cout<<V2.item(0)<<endl;
	cout<<V2.item(1)<<endl;
	cout<<V3.item(0)<<endl;
	cout<<V3.item(1)<<endl;
	V1.OrtVectors(V1,V2);
	cout<<"kolvo komponent ravnih 2: "<<V2.SearchKomp()<<endl;
	_getch();
}
Shepard90 вне форума Ответить с цитированием
Старый 16.12.2010, 18:46   #2
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
По умолчанию

Посмотрите внимательнее ваш код. У объекта threeVector, созданным конструктором без параметров, count=1, в то время как threeVector, созданный копированием, имеет count=2. Поэтому при создании второго копированием первого, вы получите неудовлетворительный результат в ф-ции Vector::item.
sashonk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Delphi]: Создание нового класса с наследованием Kolhan Помощь студентам 6 17.04.2009 00:03
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37