静态成员函数的未定义引用错误

时间:2012-07-02 16:49:55

标签: c++ undefined-reference

  

可能重复:
  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--;
        }
    }
};

下面我将创建一个抽象类Element的实例以及一些成员函数。我正在尝试构建的容器将容纳这种对象。

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;

}

我使用gcc GNU编译器使用Codeblocks 10.05进行编译。当我构建上面的main.cpp时,它给出了错误:'在每个函数中的Elements.h中对'Elements :: elements'的未定义引用:addElement,size,.... etc

这是我第一次在这个论坛上发帖。我们非常欢迎任何帮助和/或评论。

2 个答案:

答案 0 :(得分:1)

这是因为你声明了elements,但没有定义它。为此,只需在课程后添加一个定义:

vector<Element*> Elements::elements;

另外,你应该将你的标题和定义分开放在单独的文件中(* .hpp和* .cpp),不要只使用带有公共静态成员的类,那里有名称空间。

答案 1 :(得分:0)

您在班级声明中宣布了 Elements::elements。它是一个静态数据成员,所以现在你必须在某个源文件中定义它。例如,

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

这需要在一个且唯一的源文件中位于文件范围内。否则你将违反一个定义规则。