如何解决c ++代码中的编译错误?

时间:2014-10-15 09:44:47

标签: c++ class oop

#include<iostream>
#include<stdlib.h>

using namespace std;

class Solution {
public:
  void reverseWords(string& s)
  {
    cout << s;
  }
};

int main()
{
  string c;
  // c= (char *) malloc(100*sizeof(char ));
  c = "sahil solanki";
  Solution::reverseWords(&c);
}

当我编译这个程序时,它给了我错误,所以如何删除错误。我是面向对象编程的新手。

2 个答案:

答案 0 :(得分:4)

Solution::reverseWords(&c);

这是寻找静态(或&#34;类&#34;)函数reverseWords(),它不存在。 (因此错误信息&#34;没有匹配的功能&#34;。)我不会解释什么是类功能,因为它超出了简单的SO答案的范围(很可能不是你正在寻找的)在这一点上无论如何)。

要调用Solution函数,您需要该类型的对象(或实例,感谢Yann4):

Solution sol;         // construct a Solution object named sol
sol.reverseWords(c);  // tell the sol object to reverseWords()

&#34;面向对象的一般概念&#34;是class Solution定义两者数据操作该数据的函数(而不是C,其中数据通常在struct中定义,然后几个独立定义的函数对该数据进行操作。)

请注意,在&c的通话中您不需要reverseWords();这将采用c地址,这不是必需的:

void reverseWords( string & s );

这是一个采用字符串引用的函数。即,您使用字符串 object 作为参数调用它。 &#34;地址采取&#34;您可能熟悉C,允许修改参数,由于参数类型是 的引用而自动发生。如果您不希望参数可修改,请声明const引用...

void reverseWords( string const & s );

...或对象(但是,它会在堆栈上创建参数的副本):

void reverseWords( string s );

无论哪种方式,您调用该函数为sol.reverseWords(c),即没有&运算符。

当然,正如juanchopanza指出的那样,如果你使用 std::string,你必须#include <string>


三个与此无关的说明:

  • &#34;裸&#34;指针(由&cmalloc()产生的类型)在现代C ++中很少(如果有的话)是必需的。尽可能使用参考文献,并smart pointers使用参考文献。

  • using namespace std;在小型测试程序中没问题。在较大的代码库中,尤其是头文件中,显式命名空间限定(例如std::string)更好。

  • 虽然C ++支持面向对象,但它确实是一种多范式语言;不要被引诱认为&#34;一切都应该是一个对象&#34;。

答案 1 :(得分:3)

您必须创建类Solution的对象,然后使用该对象调用您的函数。

#include<iostream>
#include<stdlib.h>

using namespace std;

class Solution {
public:
  void reverseWords(string s)
  {
    cout << s;
  }
};

int main()
{
  string c;
  // c= (char *) malloc(100*sizeof(char ));
  c = "sahil solanki";
  Solution s;
  s.reverseWords(c);
}

修改

如果您使用static功能,则可以在不创建对象的情况下调用您的函数 替换

void reverseWords(string s)

static void reverseWords(string s)