Использование вектора указателя на объекты другого класса

Я безрезультатно пытался сделать следующее:

В 'used.h'

#ifndef USED_H_
#define USED_H_
#include<iostream>
#include<string>
    class used
    {
    public:
      int member=0;
      used();
      virtual ~used();
    };
#endif

В файле used.cc

#include "used.h"
used::used()
{
}
used::~used()
{
}

В 'the_user.h',

#ifndef THE_USER_H_
#define THE_USER_H_
#include<queue>
#include<iostream>
    class used;      //Class forward declaring
    class the_user
    {
    public:
      std::deque<used*> my_queue;
      the_user();
      ~the_user();
    };
#endif

Теперь я хочу получить доступ и изменить 'member' в 'the_user.cc',

    #include "used.h"
    #include "the_used.h"
    #include<iostream>
    #include<queue>
    using namespace std;
    the_user::the_user()
    {
        deque <used*> my_queue;
        my_queue.resize(6);
        used* object = new used;       <-------marked line
        for(unsigned int i=0; i<my_queue.size(); i++)
        {
           my_queue.push_back(object);
        }

        cout << my_queue[5] << endl;                     //Should give 0
        my_queue[0]->member=1000;
        cout << my_queue[0]->member << endl;             //1000
    }

в основном файле (у меня есть доступ только на чтение),

#include "the_used.h"
#include <iostream>
#include <stdlib.h>
#include <sstream>
using namespace std;
int main()
{
  the_used *object = new the_used();
}

На самом деле я получаю undefined reference to used::used() по адресу отмеченная линия. В чем проблема? Я пытался использовать то же самое для вектора, но безрезультатно. Мне не разрешено вносить изменения в int main () {}. Любая помощь будет высоко оценен.

Ой. Игнорируйте мой старый комментарий.

hegel5000 07.04.2018 01:20

Вы вряд ли увидите эту ошибку, если у вас нет объявления конструктора по умолчанию для used, который, кажется, опущен в вашем резюме. Ответ будет зависеть от того, как и где вы объявляете и / или определяете этот конструктор по умолчанию.

aschepler 07.04.2018 01:29

Разве для прототипирования в файле the_used.h не требуется class used ()?

onie 07.04.2018 01:47

Извините, это правильно в моем фактическом коде. Я исправил это здесь. Спасибо, что поправили меня. Однако вышеупомянутая проблема все еще существует. Если я вообще уберу конструктор, то получу terminate called after throwing an instance of std::bad_alloc.

onie 07.04.2018 02:05

В отладчике пробовали пошагово? Если бы вы это сделали, вы, вероятно, заметили бы, что цикл выполняется более 6 раз - тогда вам нужно выяснить, почему это так. (Кроме того, почему вы ожидаете, что my_queue[5] будет равен 0 вместо значения случайного указателя для чего-то, что вы выделили?)

Daniel Schepler 07.04.2018 02:09

Спасибо всем за помощь. Проблема все еще существует. Я пробовал работать с GDB, но ничего не уловил. У меня bad alloc, когда я закомментировал конструктор used, и undefined reference, если я оставил конструктор.

onie 07.04.2018 02:19

Вы получаете это, потому что ваш цикл выполняется вечно, увеличивая размер my_queue, пока он не исчерпает память. (Что вы бы заметили, если бы действительно отлаживали свой код. Посмотрите, как отлаживать код, особенно устанавливая точки останова и построчно переходя по работающему приложению.)

Max Vollmer 07.04.2018 02:22

Как вы компилируете / связываете свою программу? undefined reference выглядит так: stackoverflow.com/questions/12573816

chtz 08.04.2018 10:23
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Принцип подстановки Лискова
Принцип подстановки Лискова
Принцип подстановки Лискова (LSP) - это принцип объектно-ориентированного программирования, который гласит, что объекты суперкласса должны иметь...
0
9
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Объявление вашего класса не объявляет конструктор или деструктор:

class used
{
public:
    int member=0;
};

Но в вашем файле cpp вы их определяете. Ваш компилятор должен уже здесь жаловаться:

#include "used.h"
used::used()
{
}

used::~used()
{
}

Вы должны объявить конструктор и деструктор в своем классе:

class used
{
public:
    used();
    ~used();
    int member=0;
};

Тогда вот:

my_queue.resize(6);

вы фактически создадите 6 указателей, которые будут инициализированы для nullptr. Возможно, вы знаете об этом, поскольку ожидаете, что my_queue [5] вернет 0.

Затем в вашем цикле каждый раз, когда вы это делаете:

my_queue.push_back(object);

вы увеличите размер my_queue на единицу, таким образом, ваш цикл будет работать вечно.

Кроме того: Делать. Нет. Делать. using namespace std;. Всегда.

Да, извините, что это опечатка. Это так, как вы сказали в моем исходном коде.

onie 07.04.2018 02:00

Спасибо за помощь.

onie 07.04.2018 05:18

Другие вопросы по теме