我正在尝试替换非常量数组中具有常量值的结构值,但它无法编译:
“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++的新手,我不确定这种流的正确模式是什么。
在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
之类的智能指针,而不是这里的原始指针。
在初始化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
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输入可以使用类型完全建模。这是一张地图,