Я безрезультатно пытался сделать следующее:
В '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 () {}.
Любая помощь будет высоко оценен.
Вы вряд ли увидите эту ошибку, если у вас нет объявления конструктора по умолчанию для used, который, кажется, опущен в вашем резюме. Ответ будет зависеть от того, как и где вы объявляете и / или определяете этот конструктор по умолчанию.
Разве для прототипирования в файле the_used.h не требуется class used ()?
Извините, это правильно в моем фактическом коде. Я исправил это здесь. Спасибо, что поправили меня. Однако вышеупомянутая проблема все еще существует. Если я вообще уберу конструктор, то получу terminate called after throwing an instance of std::bad_alloc.
В отладчике пробовали пошагово? Если бы вы это сделали, вы, вероятно, заметили бы, что цикл выполняется более 6 раз - тогда вам нужно выяснить, почему это так. (Кроме того, почему вы ожидаете, что my_queue[5] будет равен 0 вместо значения случайного указателя для чего-то, что вы выделили?)
Спасибо всем за помощь. Проблема все еще существует. Я пробовал работать с GDB, но ничего не уловил. У меня bad alloc, когда я закомментировал конструктор used, и undefined reference, если я оставил конструктор.
Вы получаете это, потому что ваш цикл выполняется вечно, увеличивая размер my_queue, пока он не исчерпает память. (Что вы бы заметили, если бы действительно отлаживали свой код. Посмотрите, как отлаживать код, особенно устанавливая точки останова и построчно переходя по работающему приложению.)
Как вы компилируете / связываете свою программу? undefined reference выглядит так: stackoverflow.com/questions/12573816
Возможный дубликат Что такое ошибка неопределенной ссылки / неразрешенного внешнего символа и как ее исправить?


Объявление вашего класса не объявляет конструктор или деструктор:
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;. Всегда.
Да, извините, что это опечатка. Это так, как вы сказали в моем исходном коде.
Спасибо за помощь.
Ой. Игнорируйте мой старый комментарий.