修改函数中的指针(将另一个指针作为参数传递)



我在将指针传递给另一个指针调用的函数时遇到问题。我试图修改一个指针(即p1(,它调用函数min(即p1->min(((,该函数将指针作为参数(即p1->min(*p2((。注意:*p2根本没有被修改,只是传递了它的值,其中p1将根据p2的值进行修改。

注意:我删除了不相关的代码(只在函数内部,其他一切都是原样(,以便于阅读

测试.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。

请帮忙。

奇怪的是,它声明的无效

不,不是。

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*

不幸的是,你使用了右对齐的星号和符号,因为这直接导致了你的困惑。看起来您忘记了*在那里,或者认为它是函数声明本身语法的一部分(例如,在您的问题中,您如何将函数称为"*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(的声明。

有些人会开始讨论内部语法如何将*绑定到名称而不是类型,或者左对齐的方法如何使正确处理真正重要且经常使用的结构(多变量声明(稍微更困难。忽略他们

更广泛地说,你在这里有很多建议,我建议尽量减少这种情况。这只会导致不必要的麻烦爱的对象

void *Test::min(const Test *&p) { /* modifies vec */ }

如果此函数没有返回语句,请从void *中删除*

问题的解决方案是我需要返回一个void指针。这可能会导致与当前问题无关的其他问题,但这种格式有特定的参数需要遵循,这就是为什么我提到的main不能更改,以及其他内容(包括格式(。再次感谢。

最新更新