【问题标题】:undefined reference to static method error未定义的静态方法引用错误
【发布时间】:2014-05-12 19:08:56
【问题描述】:

我的函数调用有问题

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)'

【问题讨论】:

  • 尽管语法存在各种问题,但为什么要将参数传递给 makeclass 函数,因为它们是按值传递并由 cin 内的调用填充的?
  • static 看起来不对,除非你在类声明中有这个内联!否则,链接器只会看到它在其中定义的编译单元的私有。

标签: c++ static function-calls


【解决方案1】:

这段代码有很多问题。

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''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 应该是这样的:

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

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

【讨论】:

    【解决方案2】:

    如果你还在处理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){
    // ....
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-03
      • 2014-06-27
      相关资源
      最近更新 更多