为什么我的代码在代码块下而不在VS Studio中运行

时间:2019-04-02 08:49:25

标签: c++

此行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}}

3 个答案:

答案 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 stdstd是一个巨大的命名空间。您可能会无意间覆盖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;
        }