我的函数调用存在问题
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)'
答案 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){
// ....
}