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

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

Войти
Регистрация
Восстановить пароль
 
Matlabist
2 / 2 / 0
Регистрация: 28.11.2010
Сообщений: 102
#1

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

02.02.2011, 21:22. Просмотров 1005. Ответов 7
Метки нет (Все метки)

Создаю класс, который будет содержать вектора

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++
Доброго времени суток ! Не до конца понимаю &quot;Как это работает&quot;© Есть вектор указателей, объявленный в main() ...

Возможно ли создание объекта шаблонного класса в функции этого класса? - C++
Доброго времени суток, уважаемые форумчане :) Мне по лабам задали задание - реализовать шаблон контейнера (множество) с операциями...

Создание класса-списка на основе кода со списком без класса - C++
Здравствуйте. Не могли бы вы показать, как оформить этот код в виде класса. Смысл задания: это засунуть в список большое число(здесь я...

Создание указателя типа базового класса на экземпляр производного класса - C++
Добрый день! Иногда видел коды, где создавался указатель типа базового класса на объект класса - наследника, для чего это может применяться?

Построение описания класса, создание и уничтожение объектов этого класса - C++
Построить описание класса, содержащего информацию о почтовом адресе организации. Предусмотреть возможность раздельного изменения...

Создание объекта класса с полем являющимся объектом другого класса - C++
Bill a; cin&gt;&gt;a;//тут я ввел с помощью перегруженного оператора ElementSpiska c; //поля у Spiska(Bill A,int,string,int) ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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
Сообщений: 102
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
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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
Сообщений: 102
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
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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
Сообщений: 102
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;
    };
  }
lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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);
  }
...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2011, 19:54
Привет! Вот еще темы с ответами:

Явное создание экземпляра класса и явная специализация шаблона класса - C++
Всем добрый день! Не могу разобраться - эти две технологии дают один и тот же результат? В каких случаях применять одно и другое?...

Пример класса с конструктором и деструктором, создание экземпляра класса через конструктор с параметрами - C++
Привести пример класса с конструктором и деструктором, созданием экземпляра класса с помощью конструктора с параметрами.

Создание статической функции класса, которая принимает экземпляр этого же класса как объект - C++
Привет. Есть такой код class Model { public: Model(); Model(int verticesSize, int facesSize); ~Model(); static void...

создание объекта класса в методе этого же класса - C++
собственно вопрос. можно ли создавать объект класса в методе того же класса? насколько это правильно и как это можно сделать (если это...


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

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

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