4

为什么我不能简单地调用一个类对象属性(即),该属性调用一个返回该属性应具有的值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!!
}

这甚至可能吗?或者有其他选择吗?

谢谢。:)

4

3 回答 3

3

在您的代码中,类的初始化顺序Entity是:

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

如您所见,当sum从 初始化数据成员时calculateSum(),其中使用了数据成员xy但它们只是default-initialized,仍然没有按照您在构造函数主体中的预期分配。

您可以在成员初始化器列表中初始化它们。

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

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

  1. x直接初始化为构造函数参数x
  2. y直接初始化为构造函数参数y
  3. sum被初始化为calculateSum()
  4. 构造函数的主体被执行(什么都不做)

居住

于 2020-05-19T08:29:26.330 回答
3

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

于 2020-05-19T08:30:26.447 回答
1

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

std::cout << entity.sum() << std::endl; // outputs 0, should be 12!!
于 2020-05-19T08:34:45.073 回答