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

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

Войти
Регистрация
Восстановить пароль
 
CheToZudit
9 / 9 / 2
Регистрация: 22.10.2011
Сообщений: 19
#1

Ошибка при использовании STL - C++

05.12.2011, 22:14. Просмотров 900. Ответов 9
Метки нет (Все метки)

Начал знакомиться с STL, и возникли проблемы. Вот суть:
Имеется дочерний класс, одно поле которого является динамическим массивом. При попытке описать функцию, которая заполняет массив, компилятор начинает ругаться.
Это собственно сам класс:
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
#ifndef _GUARD_SHIP_H_
#define _GUARD_SHIP_H_
#include <iostream>
#include <vector>
 
#include "stdafx.h"
#include "Ship.h"
#include "Armament.h"
 
using namespace std;
 
class GuardShip : public Ship {
    vector<Armament>::iterator p;
public:
    void addArm(vector<Armament>::iterator &p);
    void removeArm(Armament arma, vector<Armament>::iterator &p);
    char* setNameArm() {return p->setName();}
    char* getNameArm() {return p->getName();}
    double getCalArm() {return p->getCal();}
    double setCalArm() {return p->setCal();}
    size_t getRangeArm() {return p->getRange();}
    size_t setRangeArm() {return p->setRange();}
    location getLocArm() {return p->getLoc();}
    location setLocArm() {return p->setLoc();}
    size_t getAmmoArm() {return p->getAmmo();}
    size_t setAmmoArm() {return p->setAmmo();}
};
 
#endif // _GUARD_SHIP_H_
Это реализация функций, которые заполняют динамический массив:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "stdafx.h"
#include "GuardShip.h"
#include <iostream>
 
 
void GuardShip::addArm(vector<Armament>::iterator &p) {
    Armament arma;
    cin >> arma;
    p.push_back(arma); //!!! ругается в этом месте, пишет, что push_back не является членом       
                                    //"std::_Vector_iterator<_Myvec>"
}
 
void GuardShip::removeArm(Armament arma, vector<Armament>::iterator &p) {
    p.erase(p);          // !!!аналогичная ошибка в этом месте
}
Душой понимаю, что проблема скорее всего в передаче итератора в функцию, да и вообще не уверен, есть ли смысл его передавать.
Буду очень благодарен за помощь
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2011, 22:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка при использовании STL (C++):

Ошибка при использовании gets() - C++
Не могу понять, почему при второй итерации цикла программа выдает ошибку и закрывается при запросе фамилии. #include &quot;stdafx.h&quot; ...

Ошибка при использовании % - C++
(условие задачи, код и ошибки при коомпиляции на скрине) Здравствуйте, задача простая, как и ее решение, на фортране бы уже пять раз...

Ошибка при использовании new[] / delete[] - C++
Здравствуйте. Пишу учебную программу, моделирующую движение лифта (если кто учебник Дейтелов читал, тот поймет :) ). Для начала приведу...

Ошибка при использовании strcpy - C++
Здравствуйте, возникла такая проблема Объявляю массив char * char *names = {&quot;asdfg&quot;, &quot;hjklqw&quot;, &quot;wertyui&quot;, &quot;bnmasdfg&quot;,...

Ошибка при использовании size_t - C++
Выдает много ошибок связанные с использованием typedef std::size_t size_type; #include &lt;iostream&gt; #include &lt;cstring&gt; #include...

Ошибка при использовании _findfirst() - C++
По условию нужно вывести все содержимое корневого каталога. Захожу в директорию, определяю наличие папок, затем (здесь ошибка) пробую...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Bers
Заблокирован
05.12.2011, 22:16 #2
huichos, ошибок "компилятор ругается" не существует.
Существуют конкретные ошибки, о которых конкретно сообщает компилятор.
0
CheToZudit
9 / 9 / 2
Регистрация: 22.10.2011
Сообщений: 19
05.12.2011, 22:19  [ТС] #3
Я отметил 9-ую и 14-ую строчки и написал в них ошибки, "о которых сообщает компилятор". Повторю еще раз:
-error C2039: push_back: не является членом "std::_Vector_iterator<_Myvec>"
with
[
_Myvec=std::_Vector_val<Armament,std::allocator<Armament>>
]
аналогичная ошибка с функцией erase()
0
Bers
Заблокирован
05.12.2011, 22:20 #4
C++
1
2
3
4
5
6
void GuardShip::addArm(vector<Armament>::iterator &p) {
 Armament arma;
 cin >> arma;
 p.push_back(arma); //!!! ругается в этом месте, пишет, что push_back не является членом * * * 
 //"std::_Vector_iterator<_Myvec>"
}
Попробуйте сделать вот так:

C++
1
2
3
4
5
void GuardShip::addArm(vector<Armament>::iterator &p) {
 Armament arma;
 cin >> arma;
 (*p).push_back(arma); //обратите внимание
}
С другой функцией-методом аналогично
1
CheToZudit
9 / 9 / 2
Регистрация: 22.10.2011
Сообщений: 19
05.12.2011, 22:31  [ТС] #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "stdafx.h"
#include "GuardShip.h"
#include <iostream>
 
 
void GuardShip::addArm(vector<Armament>::iterator &p) {
    Armament arma;
    cin >> arma;
    p->push_back(arma);
}
 
void GuardShip::removeArm(Armament arma, vector<Armament>::iterator &p) {
    p->erase(p);
}
Спасибо, Bers. Теперь новая ошибка в тех же строчках: push_back: не является членом "Armament".
Можете меня поправить, если я ошибаюсь(а делаю я это наверняка). p это указатель на эл-т контейнера, то есть прописывая (*p).myfunc() я пытаюсь вызвать функцию для эл-та контейнера. В принципе об этом наверное мне и сообщает компилятор. А как мне вызвать функцию для самого вектора?
Или проблема в том, что как такового вектора у меня еще нет, а есть ук-ль? То есть мне нужно создать буферный вектор и через него заносить эл-ты в свое вектор?
0
Bers
Заблокирован
05.12.2011, 22:36 #6
huichos, понимаете, в чем дело то..

Вы у себя храните итератор некого вектора. Этот вектор хранит в себе элементы типа Armament

Итератор - это что-то вроде указателя на элемент. (но не указатель)

То есть получается, что сам по себе p - это итератор.
а (*p) - это сам элемент.

Итератор знает, где живет элемент вектора. Но он не знает, где живет сам вектор. Понимаете?

У вас класс не содержит знания о том, где же сам вектор то находится.
0
CheToZudit
9 / 9 / 2
Регистрация: 22.10.2011
Сообщений: 19
05.12.2011, 22:42  [ТС] #7
Bers, а можете подсказать, как мне заполнить массив, если в задании сказано, что класс содержит только указатель на динамический массив?
Или без описания вектора в классе ничего не получится?
0
Bers
Заблокирован
05.12.2011, 22:43 #8
Если реально, сам вектор живет где то снаружи класса, то внутри класса кто-то должен знать, где живет вектор.

Это можно проиллюстрировать вот так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
std::vector<int> myVec; //вектор живет снаружи класса
 
class GuardShip
{
    std::vector<Armament >* pVec;  //знание о том, где живет сам вектор
                         //(указатель, который и требуется по заданию)
 
    GuardShip(std::vector<Armament >& Vec):
                         pVec(&Vec){} //здесь, при создании корабля
                                        // передаётся знание о векторе
 
    void Test()
    {
        pVec->clear(); //вызов метода вектора
    }
};
правка: ошибочка была в коде. Поправил.
1
CheToZudit
9 / 9 / 2
Регистрация: 22.10.2011
Сообщений: 19
05.12.2011, 22:51  [ТС] #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
std::vector<int> myVec; //вектор живет снаружи класса
 
class GuardShip
{
    std::vector<int>* pVec;  //знание о том, где живет сам вектор
                         //(указатель, который и требуется по заданию)
 
    GuardShip(const [B]vector<int> [/B]& Vec_):  pVec(&Vec_){} //здесь, при создании корабля
                                        // передаётся знание о векторе
 
    void Test()
    {
        pVec->clear(); //вызов метода вектора
    }
};
Извиняюсь за наглость, но может в коде есть еще ошибка? (выделил жирным свой вариант)
0
Bers
Заблокирован
05.12.2011, 22:52 #10
huichos, ага) Я поправил. Глянь ещё раз
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2011, 22:52
Привет! Вот еще темы с ответами:

Ошибка при использовании reverse_iterator - C++
std::array&lt;int, 7&gt; m = { 1, 2, 3, 4, 5, 6, 7 }; vector&lt;int&gt; v(m.begin(), m.end()); vector&lt;int&gt;::iterator pos = find(v.begin(),...

Ошибка при использовании SendKeys - C++
При нажатии на button5 окно программы должно свернуться и в окне, которое было позади него (блокнот), написать &quot;Hello world&quot;: #pragma...

Ошибка при использовании вектора - C++
Пытаюсь проанализировать текстовый файл и посчитать кол-во каждого символа. Текст на английском. Вот код: class Raspredelenie{ ...

Ошибка при использовании delete - C++
И снова здравствуйте! Пишу раз третий.Я уже готов убицца ап сцену изза этого delete.Я не понимаю что не так делаю: class CMenu { ...


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

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

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