以下代码
class Test{
private:
struct Node{
int element;
Node* next;
};
Node* stupidFunction(); // Line 8
};
///////////////////////////////
struct Node;
Node* Test::stupidFunction(){ // Line 15
Node foo;
return &foo;
}
///////////////////////////////
int main(){}
将无法编译并提供以下错误消息:
Line 15: error: prototype for 'Node* Test::studpidFunction()' does not match any in class 'Test'
Line 8: error: candidate is: Test::Node* Test::stupidFunction()
是否无法返回指向类中声明的结构的指针,或者我做错了什么?
答案 0 :(得分:3)
由于它是在Test
内定义的,Node
是嵌套类型,即Test::Node
。因此,(非内联)函数定义必须写为
Test::Node* Test::stupidFunction() {
但是,返回局部变量地址的实现严重错误。一旦函数返回,变量(此处为foo
就会超出范围,因此调用者会留下错误的指针。
一个选项是以下
Test::Node* Test::stupidFunction() {
Node * pNode = new Node;
// update pNode
return pNode;
}
但是,这个设计也有一个问题,调用者必须确保返回指针在delete
之前 - 在它超出范围之前。否则new Node
分配的内存将被泄露。
更好的选择是使用智能指针
std::shared_ptr<Test::Node> Test::stupidFunction() {
auto pNode = std::make_shared<Test::Node>();
// update pNode;
return pNode;
}
这样,调用者不需要显式delete
。只要没有指向该资源的指针即Node
,就会释放内存。
答案 1 :(得分:1)
struct节点在Test Class中定义
class Test{
private:
struct Node{
int element;
Node* next;
};
Node* stupidFunction(); // Line 8
};
///////////////////////////////
struct Node;
Test::Node* Test::stupidFunction(){ //use Node which define in class Test
Node foo;
return &foo;
}
int main(void)
答案 2 :(得分:0)
对于多样性,以下作品
auto Test::stupidFunction() -> Node*