【问题标题】:C++ Passing pointer constant as parameter from main to methodC ++将指针常量作为参数从main传递给方法
【发布时间】:2014-02-24 14:45:31
【问题描述】:

我正在尝试使用以 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:我一直在努力解决这个问题,在这里发布是最后的手段。

【问题讨论】:

  • 这段代码有很多问题。即使您像@simonc's answer那样修复调用,成员函数本身也会损坏。您需要复制字符串,而不是简单地分配(这实际上会编译错误,因为您无法分配指向数组的指针。)您不使用 std::string 是否有原因?
  • 老实说,我是 C++ 初学者,几乎没有 c 经验。我一直在焦躁地研究概念,但有效地实施它们是我遇到的困难。

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


【解决方案1】:

您的代码中有多个错误

  1. &amp;symbol(其中symbolchar[21])产生char(*)[21],直接使用symbol并让它衰减到char*或显式使用&amp;symbol[0]

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

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

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

  5. 您已经调用了new[],因此调用delete[] 也很合适,而不是在程序终止后依赖操作系统对其进行清理:(否则请遵循第 6 点)

    Molecule *molecule = new Molecule[n];
    ...
    delete[] molecule;
    
  6. 如果允许使用向量,请将Molecule *molecule = new Molecule[n]; 替换为std::vector&lt;Molecule&gt; molecules(n);

  7. 如果允许使用std::string1) 对象,请将char[21] / char* 替换为std::string 对象

其他建议:

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

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

1) 基本上你需要了解std::string 是它是一个包装原始char* 的模板,并且它已经包含使用运算符+ 和最重要的是:您无需为内存管理而烦恼。就#include &lt;string&gt;

【讨论】:

  • 非常感谢您的全程解释,经过简要研究,我将学习向量并使用它们。还有一件事,std::string的主题是什么,比如我怎样才能找到更多关于使用它的信息?谢谢
  • 谢谢!顺便说一句,这是一项学校作业,内存管理是一项要求:(。
【解决方案2】:

通话中

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

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

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

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

依靠 symboldescription char 数组自动衰减为指针。

或者,你也可以写

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

显式传递char*

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

【讨论】:

  • 非常感谢您的全程解释,经过简要研究,我将学习向量并使用它们。还有一件事,std::string的主题是什么,比如我怎样才能找到更多关于使用它的信息?谢谢。
  • @user3258542 谷歌搜索std::string tutorial 的第一个热门搜索看起来不错
猜你喜欢
  • 2015-02-12
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 2017-11-26
相关资源
最近更新 更多