[已解决]关于C++的一点问题
Tofloor
poster avatar
Emmmmmmmm
deepin
2019-03-23 05:46
Author
本帖最后由 Emmmmmmmm 于 2019-3-23 13:30 编辑

诸君帮我看看是哪里出了问题编译器报错:
/tmp/ccMJgUYl.o:在函数‘objects:bjects()’中:
1.cpp.text._ZN7objectsC2Ev[_ZN7objectsC5Ev]+0x61):对‘objects::top’未定义的引用
/tmp/ccMJgUYl.o:在函数‘objects::add()’中:
1.cpp.text._ZN7objects3addEv[_ZN7objects3addEv]+0x9c):对‘objects::top’未定义的引用
1.cpp.text._ZN7objects3addEv[_ZN7objects3addEv]+0x184):对‘objects::top’未定义的引用
1.cpp.text._ZN7objects3addEv[_ZN7objects3addEv]+0x297):对‘objects::top’未定义的引用
1.cpp.text._ZN7objects3addEv[_ZN7objects3addEv]+0x2a0):对‘objects::top’未定义的引用
/tmp/ccMJgUYl.o:1.cpp.text._ZN7objects3addEv[_ZN7objects3addEv]+0x2a6): 跟着更多未定义的参考到 objects::top
collect2: error: ld returned 1 exit status
源码:

#include
using namespace std;
class objects
{
    static  int  top;
    char  *name1;
    char  *name2;
    int  *start;
    int  *end;
public:
    objects()
    {
        start = new int [0];
        end = new int [0];
        name1 = new char [0];
        name2 =new char [0];
        top = 0;
        cout << "\n[Docker was maked.]";
    }
    ~objects()
    {
        delete [] start;
        delete [] end;
        delete [] name1;
        delete [] name2;
    cout << "\n[Docker was deleted.]";
    }
    objects add()
    {
        char  xname[2];
        int  xnumber[2];
        cout << "\n[Please enter the name of new project.]\n>>";
        cin.get(xname,2);
        cout << "\n[Please enter the start number of new object]\n>>";
        cin >> xnumber[0];
        cout << "[Please enter the end number of new object.]\n>>";
        cin >> xnumber[1];
        const int tops = top;
        int  numberbase[tops][2];
        char  namebase[tops][2];
        for(int sizes = 0;sizes <= top;sizes++)
        {
            numberbase[sizes][0] = start[sizes];
            numberbase[sizes][1] = end[sizes];
            namebase[sizes][0] = name1[sizes];
            namebase[sizes][1] = name2[sizes];
        }
        delete [] start;
        delete [] end;
        delete [] name1;
        delete [] name2;
        top++;
        const int topss = top;
        start = new int [topss];
        end = new int [topss];
        name1 = new char [topss];
        name2 = new char [topss];
        for(int sizes = 0;sizes <= top-1;sizes++)
        {
            start[sizes] = numberbase[sizes][0];
            end[sizes] = numberbase[sizes][1];
            name1[sizes] = namebase[sizes][0];
            name2[sizes] = namebase[sizes][1];
        }
        start[top] = xnumber[0];
        end[top] = xnumber[1];
        name1[top] = xname[0];
        name2[top] = xname[1];
        cout << "\n[Object was maked.]\n";
    }
    objects delet()
    {
        cout << "[Choose which object you want to delete.]\n>>";
        const int tops=top-1;
        int  numberbase[tops][2];
        char  namebase[tops][2];
        int  point;
        cin >> point;
        int  xsize=0;
        for(int sizes = 0;sizes <= top;sizes++)
        {
            if(sizes!=point)
            {
                numberbase[xsize][0] = start[sizes];
                numberbase[xsize][1] = end[sizes];
                name1[xsize] = name1[sizes];
                name2[xsize] = name2[sizes];
                xsize++;
            }
        }
        delete [] start;
        delete [] end;
        delete [] name1;
        delete [] name2;
        top--;
        const int topss = top;
        start = new int [topss];
        end = new int [topss];
        name1 = new char [topss];
        name2 = new char [topss];
        for(int size = 0;size <= top;size++)
        {
            start[size] = numberbase[size][0];
            end[size] = numberbase[size][1];
            name1[size] = namebase[size][0];
            name2[size] = namebase[size][1];
        }
            cout << "\n[Object was deleted.]\n";
    }
    objects showlist()
    {
        cout << "name    start    end" << endl;
        for(int size=0;size <= top;size++)
        {
            cout << " " << name1[size] << name2[size] << "       " << start[size] << "       " << end[size] << endl;
        }
    }
};
int main()
{
    objects m;
    int point;
    while(point == 666)
    {
        cout << "[Choose which action you want to do.]\n>>";
        cin >> point;
        switch(point)
        {
            case 0:m.add();break;
            case 1:m.delet();break;
            case 2:m.showlist();break;
            default:break;
        }
    }
    m.~objects();
}


Reply Favorite View the author
All Replies
avatar
牧野
deepin
2019-03-23 07:33
#1

这么改就好了。
Reply View the author
avatar
ritter
deepin
2019-03-23 14:14
#2
本帖最后由 ritter 于 2019-3-23 06:51 编辑

1) member function标志了返回objects,你却没有返回值,虽然编译能通过,但是有问题。
2) 手动call destructor也是活久见。
3) 声明了static却没有定义,所以报错。在class objects外面定义int objects::top=0;
5) while(point == 666) 应该用if。但是anyway point几乎不可能等于666。你随便声明一个point,正好那个地址里面的值是666的可能性也太低了几乎不存在。


Reply View the author