当前位置: 首页 > 知识库问答 >
问题:

将结构复制到具有常量值的数组

戚同
2023-03-14

我正在尝试替换非常量数组中具有常量值的结构值,但它无法编译:

“Foo”类型的对象无法赋值,因为它的复制赋值运算符已隐式删除

下面是一个例子:

struct Foo {
    const int id;
    int value;
    Foo(): id(-1), value(-1) {}
    Foo(int id): id(id), value(0) {}
};


int main(int argc, const char * argv[]) {
    Foo foos[10];
    foos[0] = Foo(1234);
    return 0;
}

我来自于一个快速的背景,在这里,当它将struct值复制到数组中时,它是有效的。

我试着做一个我认为是拷贝赋值运算符,但是对于常量成员,我试过的也不起作用。

这就是我试图为复制赋值运算符所做的:

    Foo& operator= (Foo newVal) {
        // what do I put here!?
        return *this;
    };

对数组执行memcpy是可行的,但似乎是错误的大锤。

作为C++的新手,我不确定这种流的正确模式是什么。

共有3个答案

松霖
2023-03-14

在C++中,一个对象只能初始化一次。在声明数组时,通过默认构造函数初始化常量成员。然后,尝试通过赋值更改该值

foos[0] = Foo(1234);

这种做法失败了,而且很严重。您可以做的一件事是拥有一个容器,而不是FOO,而是指向FOO的某种指针。因此,您将为指针分配内存,但只有在可能的情况下才会创建实际的对象。例如:

Foo* foos[10]; //here you have only the pointers
foos[0] = new Foo(1234); //OK, the object is inialized here

您可以考虑使用诸如std::unique_ptr之类的智能指针,而不是这里的原始指针。

权胜泫
2023-03-14

在初始化const值之后,您永远不能更改它。

从名称id听起来,移动语义是您需要的。与其拥有两个具有相同id的有效对象,还可以在对象之间移动数据,但不能复制数据。

示例:

#include <iostream>
#include <utility>

struct Foo {
    Foo() : id(-1), value(-1) {}                      // default - "invalid" values

    Foo(int id, int value) : id(id), value(value) {} // constructor
    explicit Foo(int id) : Foo(id, 0) {}             // converting ctor, delegating 

    Foo(const Foo&) = delete;                        // no copy construction
    Foo(Foo&& rhs) :                                 // move construction ok
        id(std::exchange(rhs.id, -1)),               // take id, give -1 back
        value(std::exchange(rhs.value, -1))          // take value, give -1 back
    {}
    Foo& operator=(const Foo&) = delete;             // no copy assignment
    Foo& operator=(Foo&& rhs) {                      // move assignment ok
        // give the "moved from" element our id and value and
        // take id and value from the "moved from" element
        std::swap(id, rhs.id);
        std::swap(value, rhs.value);
        return *this;
    }

    int Id() const { return id; }        // only const access
    
    int& Value() { return value; }       // non-const access in non-const context
    int Value() const { return value; }  // const access in const context

private:
    int id;
    int value;
};

int main() {
    Foo foos[2];
    foos[0] = Foo(1234);     // The temporary Foo will have (-1, -1) when it's destroyed
    for(auto& f : foos)
        std::cout << f.Id() << ' ' << f.Value() << '\n';
}

输出:

1234 0
-1 -1
伍耀
2023-03-14

C++对常量的处理非常严格。如果可能的话(没有UB),复制这样的结构将是痛苦的。也许你真正想要的是“只读”?在这种情况下,您可以使用公共getter/setter将字段设置为私有字段:

struct Foo {
    public:
        Foo(): id(-1), value(-1) {}
        Foo(int id): id(id), value(0) {}

        int getId() const {
            return id;
        }

        int getValue() const {
            return value;
        }

        void setValue(int newValue) {
            value = newValue;
        }

    private:
        int id;
        int value;
};
 类似资料:
  • 我有一个现有的dataframe,我需要在其中添加一个额外的列,该列的每一行都包含相同的值。 现有df: 新df: 我知道如何附加现有的series/dataframe列。但这是另一种情况,因为我只需要添加“Name”列,并将每一行设置为相同的值,在本例中为“abc”。

  • 我有一个包含常量变量的结构数组;我使用构造函数初始值设定项列表进行初始化,但如果我创建该结构的数组,如何初始化该结构数组的所有元素。如果结构不包含const var,那么很容易完成 如果结构不包含const var,那么它很容易完成 但如果假设结构由const var组成,那么我可以使用构造函数初始值设定项列表生成结构的单个对象,但如果我要生成结构的数组,则会出现错误 有没有办法使结构数组具有常量

  • 我正试图将一个动态结构数组的内容复制到另一个动态结构数组中,但我得到了一个错误,“无效的数组赋值”,希望有人能给我指明正确的方向。 下面是我的结构: 我的功能: 最后,我正在尝试加密代理的内容,然后复制到encryptArr,但我现在只是想弄清楚如何复制。这是一个课程,我们还没有涵盖memcpy,所以这不是一个选项。

  • 问题内容: 我有两个成员相同,我想将一个结构复制到另一个结构,请参见下面的伪代码: 然后,我有结构的,而结构的,有什么办法复制的? 问题答案: 使用转换更改类型。以下代码使用转换将type 的值复制到type 的值: 游乐场的例子 该转换仅在基础类型,除了结构标签相同的工作。

  • 问题内容: 我有字符串: 某种数据可能是字符串: 我如何将其全部转换为上述数组? ) 谢谢帮忙,PK 问题答案: 给定值 这里有一些我可以满足您需要的代码¹: ¹实际上,它的作用还不止于此:它可以简单地封装在一个函数中,并且可以在所有三个输入值上进行配置(您可以将一个具有现有值的数组传递给它,并在必要时对其进行扩展)。

  • 问题内容: 我正在使用Microsoft Sql Server Management Studio。我目前有一个包含数据的现有数据库,我将其称为DatabaseProd。我还有一个第二个数据库,其中包含用于测试的数据,因此数据既不完全正确也不是最新的。我将这个数据库称为DatabaseDev。 但是,DatabaseDev现在包含新添加的表和新添加的列等。 我想将此新模式从DatabaseDev复

  • 我正在处理一个简单的包装器模板类,它在调用特殊成员函数时记录日志。这些函数不能默认,因为它们执行其他与日志记录相关的任务。 不幸的是,当包装类型是右值引用时,复制构造函数编译失败,错误消息如下: 错误:无法将“int”左值绑定到“int” 原因是隐式复制构造函数对于右值引用成员的行为有些不同: [class.copy 12.8/15]非联合类的隐式定义的复制/移动构造函数执行其基和成员的成员级复制

  • 问题内容: 我是初学者,尝试解组以下json字符串 这是结构 这是功能 该函数正在返回 问题答案: 您的JSON输入不是的一部分,因为还有另一个JSON对象包装器,并且值属于属性。 更深入地讲,是一个JSON数组,其中的对象持有不同的键,其值可由表示。 因此,要完全描述您的JSON,您需要某种“动态”类型。例如,地图就是这种动态类型。 因此,您的原始JSON输入可以使用类型完全建模。这是一张地图,