未定义的静态方法错误引用

时间:2014-05-12 19:08:57

标签: c++ static function-calls

我的函数调用存在问题

static classname *makeclass ( char ch, int x1, int y1, int x2, int y2){

    cin >> ch >> x1 >> y1 >> x2 >> y2;
    Ship **ptr = 0;
    if ( ch != 'A' || ch != 'B' || ch != 'C' || ch  != 'D'){
            throw invalid_argument ("Error : invalid character input ");
    }

    else if ( ch == 'A'){
            classname **ptr = new derivedclassname*[5];
            for ( int i = 0 ; i < 5; i++){
                    ptr[i] = new derivedclass (x1,y1,x2,y2);
            }
            return *ptr;
    }

    return *ptr;

}

在我的主文件中:

main () {
 classname *p = classname::*makeclass ( x1,y1,x2,y2);

}

我的错误:

Ship.cpp:81:14: warning: ‘classname* makeclass(char, int, int, int, int)’ defined but not      used [-Wunused-function]
static classname *makeclass ( char ch, int x1, int y1, int x2, int y2){
          ^
/tmp/cc1eUoXA.o: In function `main':
testclass.cpp:(.text+0xc1): undefined reference to `classname::makeclass(char, int, int, int, int)'

2 个答案:

答案 0 :(得分:0)

此代码有很多的问题。

static classname *makeclass ( char ch, int x1, int y1, int x2, int y2){

此功能不应该是静态的,因为根据您提供的信息,它不与main功能位于同一文件中。

此外,由于下一行,您甚至不需要传递这些参数:

    cin >> ch >> x1 >> y1 >> x2 >> y2;

这些中的每一个都应该在函数中声明为本地。

    Ship **ptr = 0;

这个指向指针变量的指针似乎被后面声明的同名变量所掩盖......应该不惜一切代价避免这种情况。

    if ( ch != 'A' || ch != 'B' || ch != 'C' || ch  != 'D'){
            throw invalid_argument ("Error : invalid character input ");
    }

因此,如果ch 同时'A''B''C'和{{1},则'D'有效}}。事实上,你的函数总会抛出异常......

    else if ( ch == 'A'){
            classname **ptr = new derivedclassname*[5];

此声明会影响先前声明的变量。

            for ( int i = 0 ; i < 5; i++){
                    ptr[i] = new derivedclass (x1,y1,x2,y2);
            }
            return *ptr;

假设您的意思是derivedclassname而不是derivedclass。 在这里,您返回一个指向第一个指针的解除引用指针,这意味着您只能正确返回您创建的第一个classname的地址。
以下四个丢失了,并且您已经创建了内存泄漏。

    }

    return *ptr;

啊,最好的部分是最后一个,你正在取消引用一个带有0值的指针,这是一个未定义的行为,可能会崩溃你的程序。

}

最后,您的主要应该是:

main () {
    classname *p = makeclass ( x1,y1,x2,y2);
}

因为你只是在调用一个函数。不属于类的函数。

答案 1 :(得分:0)

如果您仍在处理来自https://stackoverflow.com/questions/23601774/class-factory-returns-a-pointer-to-the-instance-of-a-new-derived-class的问题,则需要将该函数定义为:

classname* classname::makeclass ( char ch, int x1, int y1, int x2, int y2){
// ....
}