类对象属性是否可以调用返回属性应具有的值的方法C++?
Can class object attributes call methods that return a value that the attribute should have in C++?
为什么我不能简单地调用类对象属性(即sum
(,调用调用方法(即calculateSum()
( 返回该属性应具有的值?我在这里忽略了什么?我知道 getter 和 setter 函数通常是如何使用的,但我喜欢简单地调用一个属性然后用方法更新它的快捷方式?
实体.h:
class Entity {
public:
Entity(int x, int y);
~Entity();
int x, y;
int sum = calculateSum();
private:
int calculateSum();
};
实体.cpp:
#include "Entity.h"
Entity::Entity(int x, int y) {
this->x = x;
this->y = y;
}
Entity::~Entity() {
}
int Entity::calculateSum() {
return x + y;
}
主.cpp:
#include <iostream>
#include "Entity.h"
int main() {
entity = Entity(5, 7);
std::cout << entity.sum << std::endl; // outputs 0, should be 12!!
}
这可能吗?还是有其他选择?
谢谢,:)
在代码中,类Entity
的初始化顺序为:
x
默认初始化为不确定值y
默认初始化为不确定值sum
初始化为calculateSum()
执行- 构造函数的主体(
x
和y
分配给函数参数(。
如您所见,当数据成员sum
从calculateSum()
初始化时,其中使用了数据成员x
和y
,但它们只是默认初始化,仍然没有在构造函数主体中按预期分配。
您可以在成员初始值设定项列表中初始化它们。
Entity::Entity(int x, int y) : x(x), y(y) {
}
那么顺序将是(与上面的概念相同,但效果发生了变化(:
x
直接初始化为构造函数参数x
y
直接初始化为构造函数参数y
sum
初始化为calculateSum()
- 构造函数的主体被执行(不执行任何操作(
住
C++没有像其他语言那样的"属性"。实现你想要的方法是使sum
成为一个函数:
class Entity {
public:
Entity(int x, int y);
~Entity();
int x, y;
int sum() { return calculateSum(); }
private:
int calculateSum();
};
由于这是C++,当然有一种方法可以得到更接近你想要的东西。这将需要您sum
一个类型的实例,该实例具有转换运算符,int
调用calculateSum
方法来检索值,尽管我认为当您可以简单地sum
方法时,不值得去那里。
PS:正如另一个答案中指出的那样,您可以获得示例的预期输出,但是在构造后为x
或y
分配不同的值后,您无法(轻松(获得正确的sum
。
检查 std::function 和 lambda 表达式。 但一般来说,你必须使用 (( 来调用一个函数,比如:
std::cout << entity.sum() << std::endl; // outputs 0, should be 12!!
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- C++概念:如何使用'concept'检查模板化结构的属性?
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 通过指向指针数组的指针访问子类的属性
- MSVC是否支持C++11样式的属性而不是__declspec
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 类的C++属性似乎已重新初始化
- Qt Quick-如何仅从c++代码与qml属性交互
- 用概念检查属性的类型
- C++如何将同一类的实例作为属性
- 按多个属性排序
- 主函数参数的属性
- "perf_event_attr"结构的"read_format"属性的选项到底是什么?
- C++删除未使用的类属性会导致 std::logic_error
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 使用内存地址访问结构的属性值
- C++调用具有 *this 属性的单个帮助程序函数
- C++ 在堆栈中包含多态属性的类对象存储
- C++ 命名参数习惯用语 - 未设置字符串属性
- 使用 CTRP 时,是否访问访问父构造函数 UB 中的子属性?