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

时间:2016-06-05 09:43:57

标签: c++

首先,我之前只学过一点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;
}

我想创建一个代码,用于创建一个名为Car的类的空实例,稍后设置字段值并在控制台上打印出来。

代码在编译期间没有出现任何错误,但我看到的结果与我的预期完全不同。它没有显示品牌名称,价格看起来甚至很奇怪,如下所示。

Brand: 
Price: 6.95322e-310

有人帮助我!非常感谢您提前。

3 个答案:

答案 0 :(得分:3)

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

例如:

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

或者:

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

答案 1 :(得分:3)

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

name = name;

函数参数和类成员都被称为name。目前,编译器将参数值分配给自身,而根本不影响类成员。这是因为函数参数的范围更直接。

可能的解决方案:

  1. 在引用班级成员时指定thisthis->name = name;
  2. 重命名函数参数:name = _name;
  3. 对于构造函数,请使用初始化列表:

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

答案 2 :(得分:3)

你的代码用散文描述它有太多错误,所以让我提出一个固定的实现,我留给你发现差异:

#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;
};

一些随机音符,没有特别的顺序:

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