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

Передать инициализированный std::vector конструктору базового класса - C++

Восстановить пароль Регистрация
 
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
05.04.2014, 20:38     Передать инициализированный std::vector конструктору базового класса #1
В общем появилась одна проблема. Никак не пойму как можно сделать. В общем дело такое:
1) Есть класс Coord, который содержит координаты.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef COORD_H
#define COORD_H
 
class Coord
{
    public:
        Coord(int, int);
        int getX(){return x;}
        int getY(){return y;}
    private:
        int x, y;
};
 
Coord::Coord(int x_, int y_):
    x(x_),
    y(y_)
{
    ;
}
 
#endif
2) Есть класс ParentClass, который содержит std::vector этих координат, манипулирует этим вектором и делает, что хочет, но есть условие: инициализироваться этот вектор должен в конструкторе.
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
#ifndef PARENT_H
#define PARENT_H
 
#include "Coord.h"
 
class ParentClass
{
    public:
        ParentClass(std::vector<Coord>);
        void print();
        
        const int VeryCoolAwesomeInfo;
    private:
        std::vector<Coord> vec;
};
 
ParentClass::ParentClass(std::vector<Coord> vec_):
    vec(vec_), 
    VeryCoolAwesomeInfo(100)
{
    ;
}
 
void ParentClass::print()
{
    for (int i = 0; i < vec.size(); i++)
        std::cout << vec[i].getX() << std::endl;
}
 
#endif
3) Есть класс ChildClass, унаследованный от ParentClass, в конструкторе которого в списке инициализации должен вызваться конструктор ParentClass(std::vector<Coord>) с соответствующей передачей аргумента.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef CHILD_H
#define CHILD_H
 
#include "Parent.h"
 
class ChildClass: public ParentClass
{
    public:
        ChildClass();  
};
 
ChildClass::ChildClass():
    ParentClass(std::vector<Coord>(2, (Coord(10, 10), Coord(20,20)) ) )    //вот здесь загвоздка, здесь я хочу передавать нужные Coord
{
    ;
}
 
#endif
Но не тут то было. Если передавать, как передал я, (Coord(10, 10), Coord(20,20)), то инициализируется передаваемый вектор только Coord(20,20), а Coord(10,10) откинется. Я так написал, потому-что не знаю как все таки в базовый класс передать все что я хочу, как Coord(10, 10), так и Coord(20,20).
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <vector>
 
#include "Child.h"
 
int main(int argc, char *argv[])
{
    ChildClass c;
    c.print();
    system("PAUSE");
    return EXIT_SUCCESS;
}
Выводит (20, 20), (20, 20), а нужно (10,10), (20, 20)
Помогите пожалуйста.

Добавлено через 33 минуты
Ну может кто нибудь сталкивался уже?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.04.2014, 20:38     Передать инициализированный std::vector конструктору базового класса
Посмотрите здесь:

std::map, std::vector и порядок обхода коллекции C++
C++ Вызов метода производного класса через обращение к методу базового класса
C++ vector<vector<double>> + std::sort()
Вывести значения std::vector<std::vector<int*> > C++
Как изменять размер std::vector<std::vector>? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 438
05.04.2014, 20:54     Передать инициализированный std::vector конструктору базового класса #2
Цитата Сообщение от dimcoder Посмотреть сообщение
C++
1
ParentClass(std::vector<Coord>(2, (Coord(10, 10), Coord(20,20)) ) ) * *//вот здесь загвоздка, здесь я хочу передавать нужные Coord
Вот так:
C++
1
ParentClass({ Coord(10, 10), Coord(20,20) })
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
05.04.2014, 21:01  [ТС]     Передать инициализированный std::vector конструктору базового класса #3
Цитата Сообщение от kamre Посмотреть сообщение
Вот так
Вот такая запись мне больше всего нравится и я ее уже пробовал, но к сожалению почему-то не компилится (как же все было бы просто).
Код
Child.h expected primary-expression before '{' token
Где то уже сегодня читал что для такой записи нужна поддержка с++11, написано было подрубить так можно:
g++ -std=c++0x
но у меня wxDevCpp c mingW и почему то такой ключ не воспринимается. Что делать?
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
05.04.2014, 21:05     Передать инициализированный std::vector конструктору базового класса #4
C++
1
ChildClass::ChildClass(): ParentClass({{10,10}, {20,20}})
Добавлено через 1 минуту
Конструкторам бы вектор по константной ссылке передавать надо, а то ненужное копирование же будет.

Добавлено через 1 минуту
Цитата Сообщение от dimcoder Посмотреть сообщение
g++ -std=c++0x
-std=c++11
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 438
05.04.2014, 21:13     Передать инициализированный std::vector конструктору базового класса #5
Цитата Сообщение от dimcoder Посмотреть сообщение
Что делать?
Разбираться со средой разработки (можно взять MSVC 2013 Express Edition, там сразу будет работать). В консоли все работает вот так:
>g++ --version
g++.EXE (rev2, Built by MinGW-builds project) 4.8.0
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


>cat 5.cpp
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
#include <iostream>
#include <vector>
 
struct Coord {
  int x, y;
  Coord(int x0, int y0) : x(x0), y(y0) {}
};
 
class Parent {
public:
  Parent(std::vector<Coord> coords) : m_coords(coords) {}
  void print() {
    for (auto c : m_coords)
      std::cout << "(" << c.x << "," << c.y << ")" << std::endl;
  }
private:
  std::vector<Coord> m_coords;
};
 
class Child: public Parent {
public:
  Child() : Parent({ {10, 10}, {20, 20} }) {}
};
 
int main()
{
  Child child;
  child.print();
}
>g++ -std=c++11 5.cpp


>a.exe
(10,10)
(20,20)
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
05.04.2014, 21:20  [ТС]     Передать инициализированный std::vector конструктору базового класса #6
DiffEreD, kamre, спасибо большое, наконец-то стало все понятно.
Цитата Сообщение от DiffEreD Посмотреть сообщение
-std=c++11
Те же яйца, вид в профиль.
Видимо устарел мой wxDevcpp со всеми потрохами, но к нему я привык. Буду искать на него обновления...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2014, 21:44     Передать инициализированный std::vector конструктору базового класса
Еще ссылки по теме:

C++ Std::vector добавить новый элемент собственного класса без использования конструктора копирования
Как корректно скопировать vector в vector внутри класса C++
C++ Реализовать аналог класса std::string с помощью vector

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.04.2014, 21:44     Передать инициализированный std::vector конструктору базового класса #7
Цитата Сообщение от dimcoder Посмотреть сообщение
но к нему я привык. Буду искать на него обновления...
Если, в этой среде, есть возможность подключать другие компиляторы (в Dev C++ - есть), просто подключите какой-нибудь mingw поновее (4.8).
Yandex
Объявления
05.04.2014, 21:44     Передать инициализированный std::vector конструктору базового класса
Ответ Создать тему
Опции темы

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