类对象属性是否可以调用返回属性应具有的值的方法C++?

Can class object attributes call methods that return a value that the attribute should have in C++?

本文关键字:属性 C++ 方法 返回 是否 对象 调用      更新时间:2023-10-16

为什么我不能简单地调用类对象属性(即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的初始化顺序为:

  1. x默认初始化为不确定值
  2. y默认初始化为不确定值
  3. sum初始化为calculateSum()
  4. 执行
  5. 构造函数的主体(xy分配给函数参数(。

如您所见,当数据成员sumcalculateSum()初始化时,其中使用了数据成员xy,但它们只是默认初始化,仍然没有在构造函数主体中按预期分配。

您可以在成员初始值设定项列表中初始化它们。

Entity::Entity(int x, int y) : x(x), y(y) {
}

那么顺序将是(与上面的概念相同,但效果发生了变化(:

  1. x直接初始化为构造函数参数x
  2. y直接初始化为构造函数参数y
  3. sum初始化为calculateSum()
  4. 构造函数的主体被执行(不执行任何操作(

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:正如另一个答案中指出的那样,您可以获得示例的预期输出,但是在构造后为xy分配不同的值后,您无法(轻松(获得正确的sum

检查 std::function 和 lambda 表达式。 但一般来说,你必须使用 (( 来调用一个函数,比如:

std::cout << entity.sum() << std::endl; // outputs 0, should be 12!!