此行Canot在VS Studio下通过,但在CodeBlocks下运行。
'void CGoods::RegisterGoods(char [],int,float)': cannot convert argument 1 from 'const char [4]' to 'char []'
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <cstring>
using namespace std;
class CGoods
{
private:
char Name[21];
int Amount;
float Price;
float Total_value;
public:
void RegisterGoods(char name[], int amount, float price)
{
strcpy(Name,name);
Amount = amount;
Price = price;
}
void CountTotal(void)
{
Total_value = Price * Amount;
}
void GetName(char name[])
{
strcpy(name,Name);
}
int GetMount(void)
{
return Amount;
}
float GetPrice(void)
{
return Price;
}
float GetTotal(void)
{
return Total_value;
}
};
int main() {
CGoods cg1;
cg1.RegisterGoods("c++", 23, 32);
cout<<cg1.GetPrice()<<endl;
cout<<cg1.GetMount();
return 0;
}
像这样:
{{1}}
答案 0 :(得分:2)
不要使用c
-constructs做事,c++
有更好的答案。 char
指针可能会导致不良行为和令人讨厌的缓冲区溢出利用等。最好使用std::string
。
将成员函数RegisterGoods
更改为:
void RegisterGoods(std::string const & name, int const amount, float const price)
{
Name = name;
Amount = amount;
Price = price;
}
以及您对Name
的声明:
private:
std::string Name;
您的返回函数GetName
用于:
std::string GetName() const
{
return Name;
}
OR
void GetName(std::string & name) const
{
name = Name;
}
还要添加std::string
的包含内容:
#include <string>
提示以获得更好的代码... don't use using namespace std
。 std
是一个巨大的命名空间。您可能会无意间覆盖std
中的某个函数,最终会遇到几乎无法理解的错误。
还要在setter函数中将参数定义为const
,所以您不能无意间更改其值。
答案 1 :(得分:2)
const char [4]
作为函数参数等效于const char *
,而字符串文字的类型为void RegisterGoods(const char *name, int amount, float price)
,只能(安全地)转换为 // Renamed to SetName given that it's what this function actually does
void SetName(const char *name)
,因此您拥有像这样更改您的参数:
char
在这里:
std::string
通常,虽然您不应该使用普通的std::string Name;
...
void SetName(std::string name)
{
// take advantage of move semantics to avoid redundant copying
// if you are using C++11 and beyond
Name = std::move(name);
}
数组在C ++中存储字符串,但是您应该更喜欢使用{{1}}:
{{1}}
答案 2 :(得分:1)
这是否意味着我们不再需要c ++中的strcpy和char?因为我用字符串替换了所有的“字符”,并且它的功能也变了。像这样:
private:
std::string Name;
public:
void RegisterGoods(const string name, int amount, float price)
{
Name=name;
Amount = amount;
Price = price;
}
const std::string GetName()
{
return Name;
}