C++ C++;:如何使getter和setter使用空构造函数
首先,我以前只学过一点点Java。从我开始对C++进行友好交流几天后,请不要把这个问题变成基本的问题,请不要降低我的问题。 我制作了一个简单的源代码,如下所示: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
#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;
};