gpt4 book ai didi

c++ - 如何初始化共享复杂初始化代码的多个常量成员变量?

转载 作者:太空宇宙 更新时间:2023-11-03 10:23:01 25 4
gpt4 key购买 nike

简介

让我们介绍这个简单的例子:

#include <cmath>

class X
{
public: // Members

/// A ^ B + A
int A;

/// A ^ B + B
int B;

public: // Specials

X(
const int & A,
const int & B
)
: A(A)
, B(B)
{
const auto Pow = static_cast<int>(std::pow(A, B));

this->A += Pow;
this->B += Pow;
}
};

琐事

  • 引入的类有两个成员变量:AB
  • 它们分别取 A ^ B + AA ^ B + B 的值。
  • 它们都有共同的复杂初始化代码(假设 std::pow 很复杂)。

问题

我想让AB 成员都const

问题

如何在不重复复杂初始化的情况下做到这一点(避免调用 std::pow 两次)?

我尝试过的

#include <cmath>

class X
{
public: // Members

/// A ^ B + A
const int A;

/// A ^ B + B
const int B;

public: // Helpers

struct Init
{
public: // Members

int A;
int B;

public: // Specials

Init(
const int & A,
const int & B
)
: A(A)
, B(B)
{
const auto Pow = static_cast<int>(std::pow(A, B));

this->A += Pow;
this->B += Pow;
}
};

public: // Specials

X(
const Init& Init
)
: A(Init.A)
, B(Init.B)
{};

X(
const int & A,
const int & B
)
: X(Init(
A,
B
))
{};
};
  1. 创建 struct Init 来代替类 X 的过去版本。
  2. 使X成员成为const,同时让Init成员成为非const
  3. 使用构造函数委托(delegate)将构造函数参数重定向到 Init
  4. 将非const 成员变量从Init 移动到X 并使它们成为const

但是,我的解决方案似乎过于复杂。任何帮助将不胜感激。

没有目标

  • 创建另一个 X 成员变量,用于存储公共(public)代码结果 (ie std::pow)。
  • X 类之外添加另一个间接级别(例如X 引入基类)。

注意事项

解决方案可以使用比 C++11 更新的 C++ 版本。

最佳答案

使用 delegating constructor对于这种情况是一个不错的选择。

class X
{
public: // Members

/// A ^ B + A
const int A;

/// A ^ B + B
const int B;

public:

X(int a, int b) : X(a, b, func1(a, b)) {}

private:

X(int a, int b, int c) : A(func2(a, b, c)), B(func3(a, b, c)) {}

static int func1(int a, int b) { return std::pow(a,b); }
static int func2(int a, int b, int c) { return (a + c); }
static int func3(int a, int b, int c) { return (b + c); }
};

func1func2func3 中的逻辑/计算可以根据需要简单或复杂。

关于c++ - 如何初始化共享复杂初始化代码的多个常量成员变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55382549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com