C ++将指针常量作为参数从main传递给方法

时间:2014-01-31 18:59:34

标签: c++ string pointers initialization argument-passing

我正在尝试使用带有const指针作为参数的函数初始化对象中的变量。

我在尝试的许多方法中都遇到了错误,这是我的代码:

class Molecule
{
   private:
    char s[21];
    char d[21];
    double w= 0;

   public:
    Molecule();
    void set(const char*, const char*, double);
    void display() const;
};

int main() {
    int n;

    cout << "Molecular Information\n";
    cout << "=====================" << endl;

    cout << "Number of Molecules : ";
    cin >> n;

    Molecule *molecule = new Molecule[n];
    for (int i = 0; i < n; i++) {
        char symbol[21];
        char description[21];
        double weight;

       molecule[i].set(&symbol,&discription,weight);
      //...
   }
   //implementation of class

   #include "Molecule.h"
   #include <iostream>
   #include <cstring>

   void Molecule::set(const char*, const char*, double)
   {

    s = &symbol;
    d = &discription;
    w = &weigth;
   }

我的问题是:如何使用常量字符作为参数从对象数组中正确调用成员函数,以及在类中将它们设置为变量的正确方法。

P.S:我一直在试图解决这个问题很长一段时间,在这里张贴是最后的选择。

2 个答案:

答案 0 :(得分:1)

在通话中

 molecule[i].set(&symbol,&discription,weight);

您正在传递指向char数组的指针。这与char*期望的set不符。

最简单/最好的解决方法是将其更改为

 molecule[i].set(symbol,description,weight);

依赖于symboldescription char数组自动衰减到指针。

或者,你也可以写

 molecule[i].set(&symbol[0],&description[0],weight);

明确传递char*

[请注意,发布的代码中还有许多其他错误。基于这个问题,我猜它们只是错别字。如果您想了解有关其他任何错误的更多信息,请更新您的问题。]

答案 1 :(得分:1)

您的代码中存在多个错误

  1. &symbol(其中symbolchar[21])产生char(*)[21],直接使用symbol并让其衰减为char*或明确使用&symbol[0]

  2. double weight;是未初始化的本地变量,使用它会导致未定义的行为 - 您应该初始化它:double weight = 0.0;

  3. 用于声明double w= 0;成员的
  4. class Molecule无效,您可以使用构造函数的初始化列表:

    Molecule() : w(0.0) { } // initializes `w` to `0.0`
    
  5. s = symbol;其中schar[21]symbolchar*不会复制字符串,以进行C风格的复制strcpy可以使用(注意C和C ++是不同的语言)

  6. 你已经调用了new[]所以调用delete[]也是好的和适当的,而不是在程序终止后依赖操作系统清理它:(否则按照第6点的说法) )

    Molecule *molecule = new Molecule[n];
    ...
    delete[] molecule;
    
  7. 如果您被允许使用向量,请将Molecule *molecule = new Molecule[n];替换为std::vector<Molecule> molecules(n);

  8. 如果您被允许使用std::string 1)对象,请将char[21] / char*替换为std::string个对象

  9. 其他建议:

    • 为变量使用有意义的名称,如果要明确区分私有成员和其他局部变量,那么好的约定就是在名称的末尾使用_

      class Molecule {
      private:
          std::string symbol_;
          std::string description_;
          double weight_;
      

    1)基本上你需要知道的std::string是它是一个包装原始char*的模板,它已经包含明确定义的复制,使用运算符连接+最重要的是:您不需要为内存管理而烦恼。只需#include <string>