我正在尝试使用带有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:我一直在试图解决这个问题很长一段时间,在这里张贴是最后的选择。答案 0 :(得分:1)
在通话中
molecule[i].set(&symbol,&discription,weight);
您正在传递指向char
数组的指针。这与char*
期望的set
不符。
最简单/最好的解决方法是将其更改为
molecule[i].set(symbol,description,weight);
依赖于symbol
和description
char
数组自动衰减到指针。
或者,你也可以写
molecule[i].set(&symbol[0],&description[0],weight);
明确传递char*
[请注意,发布的代码中还有许多其他错误。基于这个问题,我猜它们只是错别字。如果您想了解有关其他任何错误的更多信息,请更新您的问题。]
答案 1 :(得分:1)
您的代码中存在多个错误
&symbol
(其中symbol
为char[21]
)产生char(*)[21]
,直接使用symbol
并让其衰减为char*
或明确使用&symbol[0]
double weight;
是未初始化的本地变量,使用它会导致未定义的行为 - 您应该初始化它:double weight = 0.0;
double w= 0;
成员的 class Molecule
无效,您可以使用构造函数的初始化列表:
Molecule() : w(0.0) { } // initializes `w` to `0.0`
s = symbol;
其中s
为char[21]
且symbol
为char*
不会复制字符串,以进行C风格的复制strcpy
可以使用(注意C和C ++是不同的语言)
你已经调用了new[]
所以调用delete[]
也是好的和适当的,而不是在程序终止后依赖操作系统清理它:(否则按照第6点的说法) )
Molecule *molecule = new Molecule[n];
...
delete[] molecule;
如果您被允许使用向量,请将Molecule *molecule = new Molecule[n];
替换为std::vector<Molecule> molecules(n);
如果您被允许使用std::string
1)对象,请将char[21]
/ char*
替换为std::string
个对象
其他建议:
为变量使用有意义的名称,如果要明确区分私有成员和其他局部变量,那么好的约定就是在名称的末尾使用_
:
class Molecule {
private:
std::string symbol_;
std::string description_;
double weight_;
1)基本上你需要知道的std::string
是它是一个包装原始char*
的模板,它已经包含明确定义的复制,使用运算符连接+
最重要的是:您不需要为内存管理而烦恼。只需#include <string>