C++ C++;:如何使getter和setter使用空构造函数

C++ C++;:如何使getter和setter使用空构造函数,c++,C++,首先,我以前只学过一点点Java。从我开始对C++进行友好交流几天后,请不要把这个问题变成基本的问题,请不要降低我的问题。 我制作了一个简单的源代码,如下所示: #include <iostream> using namespace std; class Car { public: void setBrand(string name); void setPrice(double price); string getBrand

首先,我以前只学过一点点Java。从我开始对C++进行友好交流几天后,请不要把这个问题变成基本的问题,请不要降低我的问题。 我制作了一个简单的源代码,如下所示:

#include <iostream>

using namespace std;

class Car {
    public:
        void setBrand(string name);
        void setPrice(double price);
        string getBrand();
        double getPrice();
        Car();
        Car(string name);
        Car(string name, double price);

    private:
        string name;
        double price;
};

Car::Car() {
}

Car::Car(string name) {
    name = name;
}

Car::Car(string name, double price) {
    name = name;
    price = price;
}

void Car::setBrand(string name) {
    name = name;
}

void Car::setPrice(double price) {
    price = price;
}

string Car::getBrand(void) {
    return name;
}

double Car::getPrice(void) {
    return price;
}

int main() {
    Car car;
    car.setBrand("Nissan");
    car.setPrice(30000);
    cout << "Brand: " << car.getBrand() << endl;
    cout << "Price: " << car.getPrice() << endl;
    return 0;
}

谁来帮帮我!事先非常感谢。

您遇到的问题是使用函数参数覆盖成员名称。您可以使用
this->
使其显式化或以不同的方式命名成员

例如:

void Car::setBrand(string name) {
    this->name = name;
}
或:


在构造函数和setter中,不区分本地参数和类成员

name = name;
函数参数和类成员都被称为
name
。当前,编译器正在将参数值分配给自己,并且根本不影响类成员。这是因为函数参数位于更直接的范围内

可能的解决办法:

  • 在引用类成员时指定
    this
    this->name=name
  • 重命名函数参数:
    name=\u name
  • 对于构造函数,请使用初始值设定项列表:

    Car::Car(string name, double price)
    : name(name)
    , price(price)
    { }
    

  • 您的代码有太多错误,无法用散文来描述,因此让我介绍一个固定的实现,让您来找出区别:

    #include <string>
    
    class Car
    {
    private:
        static constexpr double kNoPrice = -1.0;
        static constexpr const char* kNoName = "[no name]";
    
    public:
        // Main constructor: constructs a car with the given name and price.
        Car(std::string name, double price)
        : name_(std::move(name))
        , price_(price)
        {}
    
        // Convenience constructors:
        Car() : Car(kNoName, kNoPrice) {}
        Car(std::string name) : Car(std::move(name), kNoPrice) {}
    
        // Accessors:
        const std::string& getBrand() const { return name_; }
        void setBrand(std::string name) { name_ = std::move(name); }
    
        double getPrice() const { return price_; }
        void setPrice(double price) { price_ = price; }
    
    private:
        std::string name;
        double price;
    };
    
    #包括
    班车
    {
    私人:
    静态constexpr-double-kNoPrice=-1.0;
    静态constexpr const char*kNoName=“[no name]”;
    公众:
    //主构造器:用给定的名称和价格构造一辆汽车。
    汽车(标准::字符串名称,双倍价格)
    :名称(标准::移动(名称))
    ,价格(price)
    {}
    //便利构造器:
    Car():Car(kNoName,kNoPrice){}
    Car(std::string name):Car(std::move(name),kNoPrice){}
    //访问者:
    常量std::string&getBrand()常量{返回名称}
    void setBrand(std::string name){name_u=std::move(name);}
    double getPrice()常量{返回价格}
    void setPrice(双倍价格){price\uu=price;}
    私人:
    std::字符串名;
    双倍价格;
    };
    
    一些随机音符,没有特定顺序:

    • 使用正确的名称。它是
      std::string
      ,而不是
      string
      mate
      buddy
      。永远不要滥用名称空间标准
    • 包括所需外部名称的标题
    • 读取未初始化的值是未定义的行为,因此任何构造函数都不应将字段保留为未初始化的(如
      price_uu
    • 为私人成员提供一致的名称(例如,在我的示例中为
      foo\uu
    • 访问者应该是常量正确的
    • 便利构造函数应该委托给一个单独的工作马构造函数
    • 为默认字段的初始值选择合理的默认值,并使其可发现
    • 获取动态管理数据(字符串、动态容器等)的所有权时使用移动语义

    • 我喜欢这个表达方式,自从我开始和C++友好相处几天之后,就不用担心了。6个月后,你将要填写离婚申请表:不要给你的程序中的每个实体赋予相同的名字,你就更不可能混淆你自己了。一个想法是把成员变量(即MyNAME')加在前面,越快越好。:)@Quentin为什么不使用名称空间更好?@Kerrek谢谢。知道为什么需要8个空间吗?我想我现在已经搞清楚降价了。因为你在一个列表中,所以这是一个额外的层次结构。如果您想退出列表并将代码置于顶层,您可以在中间插入类似于

      的内容(或只是一些更普通的文本)。@KerrekSB谢谢。嘿,非常感谢您的回答。现在我离CPP世界越来越近了!:)
      Car::Car(string name, double price)
      : name(name)
      , price(price)
      { }
      
      #include <string>
      
      class Car
      {
      private:
          static constexpr double kNoPrice = -1.0;
          static constexpr const char* kNoName = "[no name]";
      
      public:
          // Main constructor: constructs a car with the given name and price.
          Car(std::string name, double price)
          : name_(std::move(name))
          , price_(price)
          {}
      
          // Convenience constructors:
          Car() : Car(kNoName, kNoPrice) {}
          Car(std::string name) : Car(std::move(name), kNoPrice) {}
      
          // Accessors:
          const std::string& getBrand() const { return name_; }
          void setBrand(std::string name) { name_ = std::move(name); }
      
          double getPrice() const { return price_; }
          void setPrice(double price) { price_ = price; }
      
      private:
          std::string name;
          double price;
      };