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

时间:2018-11-01 17:43:43

标签: c++ pointers parameter-passing

将指针传递给另一个指针调用的函数时遇到麻烦。我正在尝试修改调用函数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。

请帮助。

3 个答案:

答案 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不能更改的原因,其中包括其他方面(包括格式)。再次感谢。