Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
#1

Наследование между шаблоном и классом - C++

20.06.2012, 19:40. Просмотров 440. Ответов 7
Метки нет (Все метки)

Очень простоя идея
1. Я хочу реализовать наследование между тимплейтом ARRAY и классом PointArray
2. Тимплеей ARRAY родитель
3. PointArray соответственно деривативный класс
4. Класс наследует все и всем реализуется тольео функция Length()
5. Length() Функция должна вычислять сумарное расстояние между всеми точками массива из класса PointArray
Моя проблема заключается в следующих моментах
1. Существуют кое какие проблемы связанные с доступам к данным класса Point для функции Length()
2. Я так же не уверен правильно ли я реализовал алгоритм функции Length()


compile error:
1>------ Build started: Project: HP_4.2.Ex3_Point_Array(concrete_inheritance), Configuration: Release Win32 ------
1> main.cpp
1>c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\PointArray1.h(70): error C2248: 'Point::m_x' : cannot access protected member declared in class 'Point'
1> c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\point.h(15) : see declaration of 'Point::m_x'
1> c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\point.h(13) : see declaration of 'Point'
1>c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\PointArray1.h(70): error C2248: 'Point::m_x' : cannot access protected member declared in class 'Point'
1> c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\point.h(15) : see declaration of 'Point::m_x'
1> c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\point.h(13) : see declaration of 'Point'
1>c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\PointArray1.h(70): error C2248: 'Point::m_y' : cannot access protected member declared in class 'Point'
1> c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\point.h(16) : see declaration of 'Point::m_y'
1> c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\point.h(13) : see declaration of 'Point'
1>c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\PointArray1.h(70): error C2248: 'Point::m_y' : cannot access protected member declared in class 'Point'
1> c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\point.h(16) : see declaration of 'Point::m_y'
1> c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\point.h(13) : see declaration of 'Point'
1>c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\PointArray1.h(70): error C2248: 'Point::m_x' : cannot access protected member declared in class 'Point'
1> c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\point.h(15) : see declaration of 'Point::m_x'
1> c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\point.h(13) : see declaration of 'Point'
1>c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\PointArray1.h(70): error C2248: 'Point::m_x' : cannot access protected member declared in class 'Point'
1> c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\point.h(15) : see declaration of 'Point::m_x'
1> c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\point.h(13) : see declaration of 'Point'
1>c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\PointArray1.h(70): error C2248: 'Point::m_y' : cannot access protected member declared in class 'Point'
1> c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\point.h(16) : see declaration of 'Point::m_y'
1> c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\point.h(13) : see declaration of 'Point'
1>c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\PointArray1.h(70): error C2248: 'Point::m_y' : cannot access protected member declared in class 'Point'
1> c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\point.h(16) : see declaration of 'Point::m_y'
1> c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\point.h(13) : see declaration of 'Point'
1>c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\PointArray1.h(72): error C2065: 'Result' : undeclared identifier
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
//array.h 
 
#ifndef ARRAY_H
#define ARRAY_H
 
template <class Type> 
class Array
 
{
protected:
  int m_size;
  Type* m_data; //m_data should be a pointer, since you want to allocate data to it
 
public:
  Array();
  Array(int new_size);
  virtual ~Array(); //Are there reason making destructor virtual?
  Array<Type>& operator=(const Array& ar); //Const correctness here.
  Type& operator [] (int index);
  const Type& operator [] (int index) const;
  int Size() const;
};
 
#ifndef ARRAY_CPP 
#include "array.cpp"
#endif //Array_CPP
 
#endif //Array_H
 
 
 
// Array.cpp
 
 
#ifndef Array_CPP
#define Array_CPP
 
#include "Array.h"
#include <sstream>
#include <iostream>
//#include <exception>
using namespace std;
template <class Type>
Array<Type>::Array() : m_size(10), m_data(0) // 
{
}
template <class Type>
Array<Type>::Array(int size) : m_size(size), m_data(new Type[size])
{ 
}
 
template <class Type>
Array<Type>::~Array()
{
  //Technically, the if is not necessary
  if(m_data)
  {
    delete[] m_data;
    m_data = 0;
  }
 
  //Not necessary either, but just to be clean
  m_size = 0;
}
template <class Type>
Array<Type>& Array<Type>::operator=(const Array& ar)
{
  //Check self assign:
  if(this == &ar) {return *this;}
  Array<Type> copy(ar); //Create a copy of ar; If this fails, then *this will not be changed, and nothing will leak
  //Succeeded creating copy. Now we can put it inside this
  this->Swap(copy); //And then swap the copy into this!
  return *this;
}
 
template <class Type> 
Type& Array<Type>::operator [] (int index) 
{
    if (index > this->m_size)
    {
        cout << "i am hreeeee" << endl;
        return this->m_data[0];
    }
    return m_data[index];
}
 
template <class Type> 
 const Type& Array<Type>::operator [] (int index) const
 {
    if (index > this->m_size)
    {
        cout << "i am hreeeee" << endl;
        return this->m_data[0];
    }
    return m_data[index];
}
 
template<class Type>
int Array<Type>::Size() const
{
    return this->m_size; 
}
 
 
 
 #endif //Array_CPP
 
 
 
 
 
 
// PointArray1.h
#ifndef POINTARRAY1_H
#define POINTARRAY1_H
 
#include "array.h"
#include <math.h>
 
template <class Point> 
class PointArray: public Array<Point>
 
{
    public: 
        PointArray();
        PointArray(int new_size);
       ~PointArray(); 
        PointArray<Point>& operator=(const PointArray<Point>& ar); 
        PointArray<Point> operator *(double factor) const;   
        double Lenght() ;
};
 
template <class Point>
PointArray<Point>::PointArray(): m_size(10), m_data(0) // default filling of array is zeros!
{
}
 
template <class Point>
PointArray<Point>::PointArray(int new_size) : Array<Point>( new_size)//: m_size(new_size), m_data(new Type[new_size])
{ 
}
 
template <class Point>
PointArray<Point>& PointArray<Point>::operator=(const PointArray<Point>& ar) 
{
     Array<Point>::operator = (ar);  // call base class assignment operator
     return *this;
}
 
template <class Point>
PointArray<Point>::~PointArray()
{
  //Technically, the if is not necessary
  if(m_data)
  {
    delete[] m_data;
    m_data = 0;
  }
  //Not necessary either, but just to be clean
  m_size = 0;
}
 
template<class Point>
PointArray<Point> PointArray<Point>::operator *(double factor) const
{
   NumericArray<Point> output(Array<Point>::Size());
   for(int i=0; i<Array::Size(); i++)
   {
      output[i] = (*this)[i] * factor;
      //return output;
   }
   return output;
}
 
double PointArray<Point>::Lenght() 
{
    PointArray<Point> answ1;
    for(int i=0; i+1<answ1.m_size; i++)
    {
        double Result =+ (answ1[i+1].m_x * answ1[i+1].m_x + answ1[i+1].m_y * answ1[i+1].m_y) - (answ1[i].m_x * answ1[i].m_x + answ1[i].m_y * answ1[i].m_y);
    }
    return sqrt(Result);
}
 
#endif //PointArray1_h 
 
 
 
 
// Point.h
#ifndef POINT_H
#define POINT_H
 
#include "array.h"
#include <sstream>
#include <iostream>
 
using namespace std;
class Point
{
protected:
    double m_x;                                
    double m_y;                                
public:
    // Constructors
    Point(): m_x(0), m_y(0) {};                            
    Point(double new_x, double new_y) : m_x(new_x), m_y(new_y) {};
    friend ostream& operator << (ostream& os, const Point& point)
{
    return os << point.ToString();
}
   string ToString() const
{
 
      std::ostringstream os; 
    os << m_x << " , " << m_y; // creating a string like: “Point(1.5, 3.9)”
    std::string double_string = os.str();
 
    return "Point(" + double_string + ")";
 
}
    Point operator *(double factor) const;   
    Point operator * (Point& ar) const;
    Point& operator *=(double factor);
};
 
#endif //Point_h
 
 
// Point.cpp 
 
#include "Point.h"
#include <sstream>
#include <iostream>
using namespace std;
 
  Point Point::operator * (double factor) const
{
    return Point(m_x * factor, m_y * factor);
}
    Point& Point::operator *= (double factor)
        {
    Point tmp = (*this) * factor;
    *this = tmp;
    return *this;
        }
 
      Point Point::operator * (Point& ar) const
{
    return Point(m_x * ar.m_x, m_y * ar.m_y);
}
 
 
//main.cpp
 
        #include "point.h"
    //  #include "Array.h"
        #include "array.cpp"
        #include <exception>
        #include "PointArray1.h"
        #include <iostream>
 
        using namespace std;
int main()
{
             
    PointArray<Point> pArray1(5);
    
    
    for(int i=0; i<pArray1.Size(); i++) 
        pArray1[i] = Point(2*i, 2*i);
 
    
 
        PointArray<Point> answ1 = pArray1 * 3;
    
    for(int i=0; i<answ1.Size(); i++)
    {
        cout << answ1[i] << endl;
        
    }
 
    answ1.Lenght();
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.06.2012, 19:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование между шаблоном и классом (C++):

В чем разница между классом и шаблоном класса? - C++
Помогите ответить. В чем разница между классом и шаблоном класса?

C++ Наследование динамического списка классом стеком. - C++
Салют форумчане. Новый курс, новые приключения. Вот и дали задание наследую динамический список создать стек. Список вроде сделал , да стек...

Наследование и полиморфизм. Задача с классом Ellipsoid - C++
Добрый день) Подскажите, поджалуйста, что по заданию корректно изменить в задаче нужно: На основе класса Shape (фигура) образовать...

Наследование: выделение память 2 способами - какая между ними разница - C++
Доброй ночи! Целый год все было нормально, а этой ночью что-то случилось с моей головой. Я в итоге полностью запутался с наследованием...

Разработать три класса, которые следует связать между собой, используя наследование - C++
Разработать три класса, которые следует связать между собой, используя наследование: класс Product, который имеет три элемент-данных -...

Заменить наследование классов на наследование интерфейсов - C++
#include &lt;iostream&gt; #include &lt;assert.h&gt; using namespace std; int people_on_base = 100; int vehicles_on_base = 100; double...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
20.06.2012, 19:44 #2
никакой дружбы и прочих привелегированных связей между классами
PointArray<Point> и Point нет. поэтому из класса PointArray<Point> есть доступ только до публичних членов и методов класса Point. У вас же попытка обращения к протектед полям m_x и m_y
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
20.06.2012, 19:48  [ТС] #3
Цитата Сообщение от DU Посмотреть сообщение
никакой дружбы и прочих привелегированных связей между классами
PointArray<Point> и Point нет. поэтому из класса PointArray<Point> есть доступ только до публичних членов и методов класса Point. У вас же попытка обращения к протектед полям m_x и m_y
А как реализовать такую дружбу ?
Т.е. у меня 2 варианта либо в дату из протектед переносить в публик либо имплементировать в поинт функции что то типа

GetX()
{
return m_x;
}
Да ?? больше других варианттов нет

алгоритм функции длины будет работать ?
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
20.06.2012, 19:53 #4
да. либо делать поля публичными, либо добавить такие вот методы Get и Set, с помощю которых можно изменять координаты. Можно еще объявить такой вот PointArray<Point> другом для класса Point, но это кривой подход. Изменять и получать значения координат наверняка понадобится в других местах. Все насвете сделать друзьями этого поинта не получится.
добавлю еще, что если у вас этот массив заточен под хранение именно Point-ов, то не надо его делать шаблоном. лучше так:
C++
1
2
3
4
class PointArray : public Array<Point>
{
 ...
};
И опять у вас ненужный деструктор и оператор =
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
20.06.2012, 20:04  [ТС] #5
Цитата Сообщение от DU Посмотреть сообщение
да. либо делать поля публичными, либо добавить такие вот методы Get и Set, с помощю которых можно изменять координаты. Можно еще объявить такой вот PointArray<Point> другом для класса Point, но это кривой подход. Изменять и получать значения координат наверняка понадобится в других местах. Все насвете сделать друзьями этого поинта не получится.
добавлю еще, что если у вас этот массив заточен под хранение именно Point-ов, то не надо его делать шаблоном. лучше так:
C++
1
2
3
4
class PointArray : public Array<Point>
{
 ...
};
И опять у вас ненужный деструктор и оператор =
Почему не нужный оператор = и деструктор не наследуется же... или типа деструктор не нужен потому что у меня нет динамических объектов ??? а = я не пользуюсь ???

я вообщем поправил с getX ()


1>------ Build started: Project: HP_4.2.Ex3_Point_Array(concrete_inheritance), Configuration: Release Win32 ------
1> main.cpp
1>c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\PointArray1.h(25): error C2614: 'PointArray<Point>' : illegal member initialization: 'm_data' is not a base or member
1> with



1> [
1> Point=Point
1> ]
1> c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\PointArray1.h(24) : while compiling class template member function 'PointArray<Point>::PointArray(void)'
1> with
1> [
1> Point=Point
1> ]
1> c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\PointArray1.h(65) : see reference to class template instantiation 'PointArray<Point>' being compiled
1> with
1> [
1> Point=Point
1> ]
1>c:\all my\с++\ha level 6\solution\level 6\hp_4.2.ex3_point_array(concrete_inheritance)\PointArray1.h(25): error C2614: 'PointArray<Point>' : illegal member initialization: 'm_size' is not a base or member
1> with
1> [
1> Point=Point
1> ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========



C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// PointArray1.h
#ifndef POINTARRAY1_H
#define POINTARRAY1_H
 
#include "array.h"
#include <math.h>
 
template <class Point> 
class PointArray: public Array<Point>
 
{
    public: 
        PointArray();
        PointArray(int new_size);
       ~PointArray(); 
        PointArray<Point>& operator=(const PointArray<Point>& ar); 
        PointArray<Point> operator *(double factor) const;   
        double Lenght() ;
};
 
template <class Point>
PointArray<Point>::PointArray(): m_size(10), m_data(0) // default filling of array is zeros!
{
}
 
template <class Point>
PointArray<Point>::PointArray(int new_size) : Array<Point>( new_size)//: m_size(new_size), m_data(new Type[new_size])
{ 
}
 
template <class Point>
PointArray<Point>& PointArray<Point>::operator=(const PointArray<Point>& ar) 
{
     Array<Point>::operator = (ar);  // call base class assignment operator
     return *this;
}
 
template <class Point>
PointArray<Point>::~PointArray()
{
  //Technically, the if is not necessary
  if(m_data)
  {
    delete[] m_data;
    m_data = 0;
  }
  //Not necessary either, but just to be clean
  m_size = 0;
}
 
template<class Point>
PointArray<Point> PointArray<Point>::operator *(double factor) const
{
   PointArray<Point> output(Array<Point>::Size());
   for(int i=0; i<Array::Size(); i++)
   {
      output[i] = (*this)[i] * factor;
      //return output;
   }
   return output;
}
 
double PointArray<Point>::Lenght() 
{
    PointArray<Point> answ1;
    double  qResult;
    for(int i=0; i+1<answ1.m_size; i++)
    {
        qResult =+ (answ1[i+1].GetX() * answ1[i+1].GetX() + answ1[i+1].GetY() * answ1[i+1].GetY()) - (answ1[i].GetX() * answ1[i].GetX() + answ1[i].GetY() * answ1[i].GetY());
    }
    //double Result;
//   Result = sqrt(qResult);
     return qResult;
}
 
#endif //PointArray1_h 
 
 
//
Добавлено через 3 минуты
Цитата Сообщение от DU Посмотреть сообщение
C++
1
2
3
4
class PointArray : public Array<Point>
{
 ...
};
А как же мне тогда дефолтный конструктор сделать
m_data же у меня Type* ????
PointArray::PointArray(): m_size(10), m_data(0) // default filling of array is zeros!
{
}
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
20.06.2012, 20:05 #6
ну вам же уже писали сегодня. не нужно этого делать, потому что это уже делается в базовом классе. в нем и выделение памяти происходит, и ее удаление, и обработка копирования.
по поводу ошибок с кривой инициализацией тоже уже писали. вы в конструкторе производного класса в списке инициализации пытаетесь проинициализировать поля базового класса. так делать нельзя. можно им какое-то значение в теле конструктора присвоить. но и это криво, потому что у базового класса Array<Point> уже есть все необходимые конструкторы и в списке инициализации PointArray их и нужно вызвать

C++
1
2
3
4
5
6
class PointArray : public Array<Point>
{
public:
  PointArray() : Array<Point>() {}
  PointArray(unsigned size) : Array<Point>(size) {}
};
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
20.06.2012, 20:17  [ТС] #7
Цитата Сообщение от DU Посмотреть сообщение
ну вам же уже писали сегодня. не нужно этого делать, потому что это уже делается в базовом классе. в нем и выделение памяти происходит, и ее удаление, и обработка копирования.
по поводу ошибок с кривой инициализацией тоже уже писали. вы в конструкторе производного класса в списке инициализации пытаетесь проинициализировать поля базового класса. так делать нельзя. можно им какое-то значение в теле конструктора присвоить. но и это криво, потому что у базового класса Array<Point> уже есть все необходимые конструкторы и в списке инициализации PointArray их и нужно вызвать

C++
1
2
3
4
5
6
class PointArray : public Array<Point>
{
public:
  PointArray() : Array<Point>() {}
  PointArray(unsigned size) : Array<Point>(size) {}
};
// [CODE]
//
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// PointArray1.h
#ifndef POINTARRAY1_H
#define POINTARRAY1_H
 
#include "array.h"
#include <math.h>
 
 
class PointArray: public Array<Point>
 
{
    public: 
        PointArray(): Array<Point>() {}
        PointArray(int  size) : Array<Point>( size) {}
       ~PointArray(); 
      //  PointArray& operator=(const Point Array& ar); 
        PointArray operator *(double factor) const;   
        void Lenght() ;
};
 
 
 
 
 
/*PointArray& PointArray::operator=(const PointArray& ar) 
{
     Array<Point>::operator = (ar);  // call base class assignment operator
     return *this;
}
*/
 
PointArray::~PointArray()
{
  //Technically, the if is not necessary
  if(m_data)
  {
    delete[] m_data;
    m_data = 0;
  }
  //Not necessary either, but just to be clean
  m_size = 0;
}
 
 
PointArray PointArray::operator *(double factor) const
{
   PointArray output(Array<Point>::Size());
   for(int i=0; i<Array::Size(); i++)
   {
      output[i] = (*this)[i] * factor;
      //return output;
   }
   return output;
}
 
void  PointArray::Lenght() 
{
    PointArray answ1;
    double  qResult;
    for(int i=0; i+1<answ1.m_size; i++)
    {
        qResult = (answ1[i+1].GetX() * answ1[i+1].GetX() + answ1[i+1].GetY() * answ1[i+1].GetY()) - (answ1[i].GetX() * answ1[i].GetX() + answ1[i].GetY() * answ1[i].GetY());
    }
    //double Result;
//   Result = sqrt(qResult);
     cout <<  qResult;
}
 
#endif //PointArray1_h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//main.cpp
 
        #include "point.h"
    //  #include "Array.h"
        #include "array.cpp"
        #include <exception>
        #include "PointArray1.h"
        #include <iostream>
 
        using namespace std;
int main()
{
             
    PointArray pArray1(5);
    
    
    for(int i=0; i<pArray1.Size(); i++) 
        pArray1[i] = Point(2*i, 2*i);
 
    
 
        PointArray answ1 = pArray1 * 3;
    
    for(int i=0; i<answ1.Size(); i++)
    {
        cout << answ1[i]<< endl;    
    }
 
    answ1.Lenght();
 
    return 0;
}

Все вроде ок копилируется только что то не хочет ратать функция длины
Выглядит это так (см принтскрин)
Миниатюры
Наследование между шаблоном и классом  
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
20.06.2012, 20:27 #8
ну кривая функция какая-то. не факт что в ней крашится вообще. вы видели что у вас пробег по локальному пустому массиву происходит? строка 59.
а вообще осваивайте возможности дебагера, чтобы по каждой мелочи не бегать на форум.

Вот дефолтный конструктор:
Array<Type>::Array() : m_size(10), m_data(0) //
{
}

т.е. размер задали отличный от нуля, а памяти од 10 объектов не выделели. Поэтому и криво все. Вроде как размер массива не нулевой, но при попытке обратится к первому элементу у вас обращение по нулевому указателю.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2012, 20:27
Привет! Вот еще темы с ответами:

Ошибка с шаблоном - C++
Собсно,только начал изучать шаблоны,кажется,что-то упустил,ну в общем вот: #include &lt;iostream&gt; using namespace std; ...

Проблемы с шаблоном класса - C++
Здравствуйте, помогите пожалуйста понять в чем ошибка, пытаюсь написать шаблон класса векторов, но получаю следующее: 1&gt;main.obj :...

Поиск по файле за шаблоном - C++
Как произвести поиск по файлу? У файле есть имена и номера. Например: Олег 0973205615 Миша 0634487931 Алла 0971473025 Оля...

Работа со списком, шаблоном - C++
Помогите, пожалуйста, реализовать класс List, представляющий список, элементами которого являются вещественные числа. Класс должен...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.06.2012, 20:27
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru