将指针传递给另一个指针调用的函数时遇到麻烦。我正在尝试修改调用函数min(即p1-> min())的指针(即p1),该函数将指针作为参数(即p1-> min(* p2))。注意:* p2完全不修改,只是传递其值,将根据p2的值修改p1。
注意:为了方便阅读,我删除了不相关的代码(仅在函数内部,其他所有内容均保持不变)。
Test.h
// Don't worry about the create method, just assume it works
// I'm having issues with the "min" function, more details below
class Test {
protected:
std::vector<std::vector<std::string> > vec;
public:
static Test *create(std::string file); // instantiates vec
void *min(Test *); // modifies vec
};
Test.cc
// Don't worry about create (factory method), just assume it works
// "min" is causing compiler errors (see below)
Test *Test::create(string file) { /* instantiates vec with file contents */ }
void *Test::min(const Test *&p) { /* modifies vec */ }
main.cc
// Main cannot change, this is how it must be implemented
// However, Test.cc and Test.h CAN be modified.
Test *p1 = Test::create("file1");
Test *p2 = Test::create("file2");
p1->min(*p2); // modify p1 based on values of p2, p2 is NOT modified
编译器错误:
fatal error: control reaches end of non-void function
奇怪的是它声明为void但期望返回值因此,当我返回某些内容时,它会显示另一个编译器错误
fatal error: no viable conversion from return value of type 'Test' to function return type 'void *'
我对编译错误很困惑。我认为这与我的声明有关。注意:没有构造函数,因为基类必须使用工厂方法,而派生类使用其自己的构造函数,因此* Test :: create和* Test :: min。
请帮助。
答案 0 :(得分:1)
奇怪的是它声明为无效
不,不是。
Test *Test::create(string file) { /* instantiates vec with file contents */ }
// ^^^^^^ return type is Test*
void *Test::min(const Test *&p) { /* modifies vec */ }
// ^^^^^^ return type is void*
不幸的是,您使用右对齐的星号和&符,因为它直接导致您的困惑。好像您忘记了*
一样,或者认为它是函数声明本身语法的一部分(例如,在您的问题中,您如何将函数称为” {{1 }}和*Test::create
“ )。
如果您开始将它们向左对齐(这不会影响程序的语义,它只是样式),您的意图和类型的含义就会很清楚:
*Test::min
现在,您可以一目了然地看到您的返回类型不是您想的那样,并且可以更正Test* Test::create(string file) { /* instantiates vec with file contents */ }
void* Test::min(const Test*& p) { /* modifies vec */ }
(可能还有Test::min
)的声明。
有些人将开始讨论内部语法如何将Test::create
绑定到名称而不是类型,或者关于左对齐方法如何使其稍微有点尴尬,难以正确理解真正重要且经常使用的结构,即多变量声明。忽略它们!
从广义上讲,这里有很多建议,我建议尽量减少这种情况。这只会导致不必要的麻烦。 爱的对象。
答案 1 :(得分:0)
void *Test::min(const Test *&p) { /* modifies vec */ }
如果此函数没有return语句,请从*
中删除void *
。
答案 2 :(得分:0)
我的问题的解决方案是我需要返回一个空指针。这可能会导致其他问题与此当前问题无关的问题,但是此格式具有要遵循的特定参数,这就是为什么我提到main不能更改的原因,其中包括其他方面(包括格式)。再次感谢。