2012-07-02 2 views
-1

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, .... и т. Д.

Это первый раз, когда я разместил на этом форуме. Любая помощь и/или комментарии приветствуются.

+2

Поиск неопределенной ссылки на данные 'static' member, на этом форуме. Вы получите сотни тем. – Nawaz

+0

Вы забыли инициализировать статический член класса – hamed

+0

add 'Elements :: vector elements();' после определения класса – hamed

ответ

0

У вас есть , объявленныйElements::elements в декларации вашего класса. Это статический член данных, поэтому теперь у вас есть определите его в каком-то исходном файле. Например,

vector<Element::Element*> Elements::element; 

Это должно быть в области файлов в одном и только исходном файле. В противном случае вы будете нарушать одно правило определения.

1

Это справедливо, потому что вы объявили elements, но не определили его. Для того, чтобы сделать это, просто добавить определение после класса:

vector<Element*> Elements::elements; 

Кроме того, вы должны отделить ваши заголовки и определения в отдельных файлах (* .hpp и * .cpp) и не использовать класс с единственным публичным статические члены, для этого существуют пространства имен.

Смежные вопросы