Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
11 / 11 / 3
Регистрация: 22.10.2011
Сообщений: 19

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

05.12.2011, 22:14. Показов 2786. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.12.2011, 22:14
Ответы с готовыми решениями:

Ошибка при использовании vector (в конце, после вывода результатов выскакивает ошибка, но сам результат коректен)
Суть в следующем, мы считываем введеные значения и выводим этот массив Проблема такова что массив выводиться, корректно, но в конце...

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

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

9
Заблокирован
05.12.2011, 22:16
huichos, ошибок "компилятор ругается" не существует.
Существуют конкретные ошибки, о которых конкретно сообщает компилятор.
0
11 / 11 / 3
Регистрация: 22.10.2011
Сообщений: 19
05.12.2011, 22:19  [ТС]
Я отметил 9-ую и 14-ую строчки и написал в них ошибки, "о которых сообщает компилятор". Повторю еще раз:
-error C2039: push_back: не является членом "std::_Vector_iterator<_Myvec>"
with
[
_Myvec=std::_Vector_val<Armament,std::al locator<Armament>>
]
аналогичная ошибка с функцией erase()
0
Заблокирован
05.12.2011, 22:20
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
11 / 11 / 3
Регистрация: 22.10.2011
Сообщений: 19
05.12.2011, 22:31  [ТС]
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
Заблокирован
05.12.2011, 22:36
huichos, понимаете, в чем дело то..

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

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

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

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

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

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

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
11 / 11 / 3
Регистрация: 22.10.2011
Сообщений: 19
05.12.2011, 22:51  [ТС]
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
Заблокирован
05.12.2011, 22:52
huichos, ага) Я поправил. Глянь ещё раз
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.12.2011, 22:52
Помогаю со студенческими работами здесь

Ошибка при использовании kbhit
выходит по ошибке(компилируется норм) происходит это только из-за kbhit() в 48-ой строчке. не знаю почему так, все перепробовала ...

Ошибка при использовании keyhash
Добрый день, имеется такой код: template &lt;typename K, size_t tableSize&gt; struct KeyHash { unsigned long operator()(const K...

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

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

Ошибка при использовании debug
при использовании debug в codeblocs в консоли высвечивается ошибка,как её исправить? oc:linux ubuntu 14.04


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru