首页 > 解决方案 > 类对象属性可以调用返回属性在 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!!
}

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

谢谢。:)

标签: c++class

解决方案


在您的代码中,类的初始化顺序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. 构造函数的主体被执行(什么都不做)

居住


推荐阅读