Possible Duplicate:
C++: undefined reference to static class memberНеопределенная ссылка ошибка для функции статического члена
Моя цель здесь, чтобы объект-контейнер, который будет содержать объекты. Я решил использовать вектор указателей, чтобы сделать это.
Помимо объекта-контейнера, будет существовать абстрактный базовый класс, который будет иметь функцию print. Это виртуальная функция, так как производные классы смогут переопределить функцию. Наконец, я создаю объект из этого производного класса и пытаюсь сохранить его в контейнере.
Ниже заголовочный файл, который содержит определение абстрактного класса
Element.h
#ifndef ELEMENT_H
#define ELEMENT_H
using namespace std;
//Abstract class with pure virtual functions
class Element{
public:
virtual void print()=0;
};
#endif
Ниже я пытаюсь создать класс шаблон для контейнера. Наряду с функциями-членами, чтобы манипулировать контейнер, как в обратном порядке, печать и т.д.
Elements.h
#include <vector>
#include <Element.h>
using namespace std;
//Creating a class which will hold the vector of pointers
class Elements{
public:
static vector<Element*> elements;
static void addElement(Element*e){
elements.push_back(e);
}
static unsigned int size() {
return elements.size();
}
static void print_all() {
for (int i=0;i<elements.size();i++){
elements[i]->print();
}
}
static void reverse(){
int i=0;
int j=elements.size()-1;
while(!(i==j)&&!(i>j)){
Element*temp;
temp=elements[i];
elements[i]=elements[j];
elements[j]=temp;
i++;
j--;
}
}
};
Ниже я создаю экземпляр элемента абстрактного класса наряду с несколькими функциями-членами. Контейнер, который я пытаюсь создать, будет содержать такие объекты.
I.h
#include <iostream>
#include <istream>
#include <ostream>
#include <vector>
#include <Element.h>
using namespace std;
class I:public Element{
int myInteger;
public:
I();
I(int);
void setI(int);
int getI(void);
void print();
};
I::I(int inInteger){
setI(inInteger);}
void I::setI(int inInteger){
myInteger=inInteger;
}
int I::getI(){
return myInteger;
}
void I::print(){
cout<<"\nThe value stored in the Integer:"<<getI();
}
Ниже я пытаюсь создать объекты типа I. Введите значение в нем, получая свою продукцию. Затем «подталкивая» их в контейнер. main.cpp
#include <iostream>
#include <istream>
#include <ostream>
#include <vector>
#include "Element.h"
#include "I.h"
#include "Elements.h"
using namespace std;
int main() {
int userInt;
Element*element;
cout<<"enter an integer";
cin>>userInt;
element = new I(userInt);
element->print();
Elements::addElement(element);
Element*element2;
cout<<"enter an integer";
cin>>userInt;
element2=new I(userInt);
element2->print();
Elements::addElement(element2);
Elements::print_all();
Elements::reverse();
int i=Elements::size();
cout<<i;
}
Я использую CodeBlocks 10.05 для компиляции, используя компиляторов GNU GCC. Когда я создаю вышеуказанный файл main.cpp, он дает мне ошибку: «неопределенная ссылка на« Элементы :: элементы »в Elements.h в каждой из функций: addElement, size, .... и т. Д.
Это первый раз, когда я разместил на этом форуме. Любая помощь и/или комментарии приветствуются.
Поиск неопределенной ссылки на данные 'static' member, на этом форуме. Вы получите сотни тем. – Nawaz
Вы забыли инициализировать статический член класса – hamed
add 'Elements :: vector elements();' после определения класса –
hamed