gpt4 book ai didi

c++ - 是否可以使用未定义为 const 的工厂方法来定义 const 成员?

转载 作者:行者123 更新时间:2023-11-27 23:38:11 27 4
gpt4 key购买 nike

我的头文件中有一个静态的私有(private)数据成员,我希望它也是常量。但是,当我使用返回该类型对象的工厂方法为构造函数中的该成员赋值时,我收到一条错误消息,指出该方法未标记为常量。有什么方法可以用 const 定义我的成员,还是只需要保持它可变?

这是我写的代码:

.h文件:

class Dealer {

static std::tuple<std::string, std::string,
std::string, std::string> suits;

.cpp 文件:

Dealer::Dealer () {

suits = std::make_tuple (
"Spades", "Hearts", "Diamonds", "Clubs");

因为现在代码可以编译,但是当我尝试使用 const 关键字定义西装元组时,这是我得到的错误:

 candidate
function not viable: 'this' argument has type 'const std::tuple<std::string, std::string, std::string, std::string>' (aka
'const tuple<basic_string<char, char_traits<char>, allocator<char> >, basic_string<char, char_traits<char>, allocator<char> >,
basic_string<char, char_traits<char>, allocator<char> >, basic_string<char, char_traits<char>, allocator<char> > >'), but
method is not marked const
tuple& operator=(typename conditional<_CanMoveAssign::value, tuple, __nat>::type&& __t)

最佳答案

首先,将成员声明为static,然后在构造函数中对其进行初始化是没有意义的。

My understanding of static is if the value of that member will be consistent across all instances of that class, then it should be static. In this case the Dealer class will always have the same four suits to be used for creating Card objects.

您的理解是正确的,但是您不应该在构造函数中对其进行初始化,因为对于您创建的每个实例,该成员都会被再次初始化。

接下来,不清楚为什么要使用元组。元组用于元素的非均匀集合(例如字符串、整数和 double )。对于同类集合,没有理由使用元组。由于元素的数量是固定的,您可以使用 std::array。那将是

class Dealer {
// declaration:
static const std::array<std::string,4> suits;

};

// definition in the source file:
const std::array<std::string,4> Dealer::suits = {"a","b","c","d"};

但是,为了解决您的错误,我们假设该成员不是static,那么这个

struct foo_broken {
const int x;
foo_broken() {
x = 5;
}
};

将不起作用。在构造函数的主体被执行之前,成员被初始化。在构造函数中你不能初始化,只能分配给它们。因为 xconst 我们不能给它赋值。解决方案是使用初始化列表,如

struct foo {
const int x;
foo() : x(5) {}
};

如果可能的话,你应该总是更喜欢初始化列表而不是构造函数中的赋值。否则你会进行不必要的赋值(如果成员是 const,它就会完全失败)。

PS:上下文太少无法确定,但您应该考虑使用 enum 而不是字符串。当您需要在屏幕上打印值时,字符串很好,但对于其他一切,enum 更合适。

PPS:您的代码中没有“工厂方法”。该术语指的是此处不存在的相当具体的内容。如果您确实有工厂方法,则应将其包含在问题中,但对于静态成员而言,是否通过工厂创建实例并不重要。

关于c++ - 是否可以使用未定义为 const 的工厂方法来定义 const 成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57567683/

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