gpt4 book ai didi

c++ - const 成员结构的动态分配

转载 作者:行者123 更新时间:2023-11-30 04:38:56 24 4
gpt4 key购买 nike

我有一个类使用带有 const 变量的纯数据结构,我不确定我是否以正确的方式分配了这些结构。它看起来或多或少像:

#include <cstdlib>
#include <iostream>
using std::cout;
using std::endl;

struct some_const_struct {
const int arg1;
const int arg2;
};

class which_is_using_above_struct {
private:

some_const_struct* m_member;

const some_const_struct* const m_const_member;

public:

const some_const_struct& get_member() const { return *m_member; }

const some_const_struct& get_const_member() const { return *m_const_member; }

void set_member(const int a, const int b) {
if(m_member != NULL) {
delete m_member;
m_member = NULL;
}
m_member = new some_const_struct((some_const_struct){a, b});
}

explicit which_is_using_above_struct(const int a, const int b)
: m_const_member(new some_const_struct((const some_const_struct){a, b})) {
m_member = NULL;
}

~which_is_using_above_struct() {
if(m_member != NULL) {
delete m_member;
}
if(m_const_member != NULL) {
delete m_const_member;
}
}

};

int main() {
which_is_using_above_struct c(1, 2);
c.set_member(3, 4);
cout << "m_member.arg1 = " << c.get_member().arg1 << endl;
cout << "m_member.arg2 = " << c.get_member().arg2 << endl;
cout << "m_const_member.arg1 = " << c.get_const_member().arg1 << endl;
cout << "m_const_member.arg2 = " << c.get_const_member().arg2 << endl;
return 0;
}

我只是不太确定声明是否:

m_member = new some_const_struct((some_const_struct){a, b});

不会对 some_const_struct 的复制构造函数产生不必要的使用,因此分配该结构两次。你怎么认为?使该结构的成员成为 const 是否合理? (他们一生中根本不应该改变)

最佳答案

m_const_member(new some_const_struct((const some_const_struct){a, b}))

标准 C++ 不允许这样的语法,您的编译器仅将其作为扩展支持。

我认为当前标准1唯一符合标准的方法是使用复制构造和辅助函数以可移植的方式初始化结构。2

inline some_const_struct make_some_const_struct(int a, int b)
{
some_const_struct x = {a, b};
return x;
}

//usage:
m_const_member(new some_const_struct(make_some_const_struct(a, b)))

我认为你应该让你的生活更轻松,而不是使用 const 成员,特别是因为 set_member 允许你无论如何修改字段(在编码和性能方面都付出了巨大的代价)。

您也可以为类提供构造函数3,但如果这对您很重要,那么它们将不再是普通的旧数据结构。 (实际上,我不确定具有 const 成员的结构是否首先符合 POD 的条件:例如,memsetting 和 memcpying 这样的结构会违反成员的常量性,但对于真正的 POD 结构来说应该是合法的事情。)


1 据我所知,C++0x 将在初始化中修改有关 {} 的规则,使其更容易实现您想要的。

2 在有利条件下,编译器应该能够优化掉不必要的拷贝,将其转换为与您正在做的事情完全相同的内容。

3 Comeau's compiler似乎很有帮助。它甚至会告诉您(它认为)您应该做什么:warning: class "some_const_struct"defines no constructor to initialize the following: ...

关于c++ - const 成员结构的动态分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2793694/

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