我有一个类,它使用带有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的复制构造函数的无效使用,ergo会分配该结构两次。你怎么看?将结构的成员构造为const是否合理? (他们一生都不应该改变)
答案 0 :(得分:1)
使struct成员const意味着你应该在结构构造函数中指定它们(是的,结构可以有一个构造函数)。
struct some_const_struct {
const int arg1;
const int arg2;
some_const_struct(int n1, int n2) : arg1(n1), arg2(n2) {}
};
我不明白你为什么不希望m_member
成为const,因为你没有修改它。
您可能实际上更好地在结构中使用非const成员,因为您在需要时声明整个struct const。
答案 1 :(得分:1)
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 ,但如果这对您很重要,那么它们将不再是Plain Old Data结构。 (实际上我不确定具有const成员的结构是否首先符合POD:例如memsetting和memcpying这样的结构会违反成员的常量,但应该是真正的POD结构的合法事项。)< / p>
1 AFAIK,C ++ 0x将在初始化中修改有关{}
的规则,使您更容易实现所需。
2 在有利的条件下,编译器应该能够优化不必要的副本,将其转换为与您正在进行的完全相同的操作。
3 Comeau's compiler似乎非常有帮助。它甚至告诉你应该做什么(它认为):warning: class "some_const_struct" defines no constructor to initialize the following: ...
答案 2 :(得分:0)
为什么不为struct编写构造函数:
struct some_const_struct
{
const int arg1;
const int arg2;
some_const_struct(int a, int b) : arg1(a), arg2(b){}
};
然后你可以使用:
m_member = new some_const_struct(a, b);
避免不必要的复制和冗长的代码。