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

Создание класса с вектором - C++

Восстановить пароль Регистрация
 
Matlabist
2 / 2 / 0
Регистрация: 28.11.2010
Сообщений: 98
02.02.2011, 21:22     Создание класса с вектором #1
Создаю класс, который будет содержать вектора

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Curve
{
    protected:
        vector <double> XPoints;
        vector <double> YPoints;
    public:
        Curve() 
        {
 
        }
        //double* points[][2];
 
};
уже вылезли ошибки
.cpp(40) : error C2143: syntax error : missing ';' before '<'
.cpp(40) : error C2501: 'vector' : missing storage-class or type specifiers
.cpp(40) : error C2059: syntax error : '<'
.cpp(40) : error C2238: unexpected token(s) preceding ';'
.cpp(41) : error C2143: syntax error : missing ';' before '<'
.cpp(41) : error C2501: 'vector' : missing storage-class or type specifiers
.cpp(41) : error C2059: syntax error : '<'
.cpp(41) : error C2238: unexpected token(s) preceding ';'
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2011, 21:22     Создание класса с вектором
Посмотрите здесь:

Создание класса C++
C++ создание класса
создание класса C++
C++ С++ создание класса
Создание экземпляр класса из другого класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
02.02.2011, 21:56     Создание класса с вектором #2
Хм. Чем это вы таким собираете? У меня GCC собирает. Может, вы от нас часть кода скрыли (учитывая номера строк)?
Вы подумайте, может лучше сделать не двумя векторами, а одним?

C++
1
2
3
4
5
6
7
class Curve {
 public:
  Curve() {
  }
 private:
  vector<pair<double, double> > Points;
};
Matlabist
2 / 2 / 0
Регистрация: 28.11.2010
Сообщений: 98
02.02.2011, 22:15  [ТС]     Создание класса с вектором #3
Цитата Сообщение от lemegeton Посмотреть сообщение
Хм. Чем это вы таким собираете? У меня GCC собирает. Может, вы от нас часть кода скрыли (учитывая номера строк)?
Вы подумайте, может лучше сделать не двумя векторами, а одним?

C++
1
2
3
4
5
6
7
class Curve {
 public:
  Curve() {
  }
 private:
  vector<pair<double, double> > Points;
};
Понял, оказывается надо было написать: using namespace std;
А как в это вектор записывать данные?
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
03.02.2011, 08:03     Создание класса с вектором #4
Не надо пользоваться директивой using namespace. Это на корню убивает неймспейсы. Лучше уж использовать using std::vector, а еще лучше просто дописывать std. В наш-то век просвещенного копипаста...

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
#include <cstdio>
#include <cstddef>
#include <vector>
 
class Curve {
 public:
  // для удобства, сделаем определение своих типов
  // структура может стать легче, чем std::pair
  typedef struct Point {
    double x;
    double y;
    Point(double x_, double y_) : x(x_), y(y_) {} // для удобства добавления значений
                                                  // в виде Point(x, y)
  } Point;                                        // Curve::Point
  typedef std::vector<Point> VectorOfPoints;      // Curve::VectorOfPoints
  Curve() {}
  // помещает точку в массив
  void PushBack(const Point &value) {
    points_.push_back(value);
  }
  // возвращает точку из массива
  Point &At(size_t position) {
    return points_[position];
  }
  // удаление точки из массива
  void Erase(size_t position) {
    points_.erase(points_.begin() + position);
  }
  // возвращает количество точек в кривой
  inline size_t Size() const { return points_.size(); }
  // для удобства обращения к объекту, как к массиву Curve[i]
  Point &operator[](size_t position) { return At(position); }
 private:
  VectorOfPoints points_;                         // собственно, сам массив
};
 
int main(int argc, char **argv) {
  Curve curve;
  curve.PushBack(Curve::Point(1.1, 2.2));
  curve.PushBack(Curve::Point(2.1, 2.3));
  curve.PushBack(Curve::Point(4.6, 6.1));
  curve[2] = Curve::Point(4.0, 6.0);
  curve.Erase(1);
 
  for (int i = 0; i < curve.Size(); ++i) {
    Curve::Point point = curve.At(i);
    printf("Curve point %2d (%1.2f, %1.2f).\n", i, point.x, point.y);
  }
 
  return 0;
}
Matlabist
2 / 2 / 0
Регистрация: 28.11.2010
Сообщений: 98
03.02.2011, 20:29  [ТС]     Создание класса с вектором #5
Сделал конструктор, который читает из файл.
Файл такого типа
C++
1
2
3
4
n
x1 y1
...
xn yn
Есть ли какие-нибудь ошибки, замечания по коду?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  Curve(char FileName[50]) {
    std::ifstream ifs("1.txt");
    if (!ifs) 
    {
        printf("Cannot open file %s",FileName);
        exit(1);
    };
    int n;ifs >> n;double x,y;
    char temp;
    for (int i=0;i<n;i++) {
        ifs.get(temp);
        ifs >> x;ifs >> y;
        PushBack(Curve::Point(x,y));
    };
 
    ifs.close();
  }
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
03.02.2011, 20:50     Создание класса с вектором #6
Много недоработок, много.
C++
1
2
3
4
5
6
7
8
9
10
11
12
  explicit Curve(const char *file_name) {
    FILE *infile = fopen(file_name, "r");
    if (infile != NULL) {
      float x, y;
      size_t read_item_count;
      while (!feof(infile) &&
            ((read_item_count = fscanf(infile, "%f %f", &x, &y)) == 2)) {
        PushBack(Point(x, y));
      }
    }
    fclose(infile);
  }
Matlabist
2 / 2 / 0
Регистрация: 28.11.2010
Сообщений: 98
04.02.2011, 18:08  [ТС]     Создание класса с вектором #7
Посмотрел в отладке записывает только первую строку.
x1 y1
x2 y2
...
xn yn
Попробовал вот так
fscanf(infile, "%f %f\n", &x, &y)
не помогло.

Добавлено через 21 час 1 минуту
Написал функцию член которая выдает значение y от x в зависимости от исходных данных.
Программа зависает на строке
YValue=(itm->y)+(XValue-(itm->x))*((it->y)-(itm->y))/((it->x)-(itm->x));}
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
  bool Value(double XValue,double &YValue) // получить значения y от x
  {
    std::vector<Point>::iterator it = points_.begin();
    std::vector<Point>::iterator end = points_.end();
    double eps=1e-5;
    if ((XValue<(it->x))||(XValue>((end-1)->x)))//||(Size()==0))
    {
        //YValue=(end-1)->x;
        return false;
    }
    else
    {
        std::vector<Point>::iterator itm;
        while  ((it->x)<XValue)
        {
            itm=it;it++;
        };
        if (it!=end) {
            YValue=(itm->y)+(XValue-(itm->x))*((it->y)-(itm->y))/((it->x)-(itm->x));}
        else {
            YValue=itm->y;};
 
        return true;
    };
  }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2011, 19:54     Создание класса с вектором
Еще ссылки по теме:

C++ Работа с вектором из класса
C++ Создание экземпляра класса до определения класса

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

Или воспользуйтесь поиском по форуму:
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
04.02.2011, 19:54     Создание класса с вектором #8
Тогда уж
C++
1
2
3
4
5
6
7
  Curve::Point *GetByY(double y_value, double epsilon = 0.00001) {
    for (int i = 0; i < Size(); ++i) {
      if (fabs(points_[i].y - y_value) < epsilon)
        return &points_[i];
    }
    return NULL;
  }
Не забывайте, что архитектура х86 не позволяет сравнивать два числа с плавающей точкой.

Пример использования:
C++
1
2
3
4
5
6
...
  Curve::Point* point;
  if ((point = curve.GetByY(1.23)) != NULL) {
    printf("Point (%f, %f)\n", point->x, point->y);
  }
...
Yandex
Объявления
04.02.2011, 19:54     Создание класса с вектором
Ответ Создать тему
Опции темы

Текущее время: 05:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru