【发布时间】:2012-03-02 08:55:23
【问题描述】:
我在使用模板结构时遇到了一些问题。
template<typename T>
struct A{
const int v1;
T* v2;
};
我的目的是让v1 始终不可编辑,而如果我使用T,v2 应该是可编辑的,如果我使用const T 作为类型,则不可编辑。
如果我创建构造函数来初始化A,则结构变为:
template<typename T>
struct A{
const int v1;
T* v2;
A() : v1(-1) { v2=NULL; }
A(int value) : v1(value) { v2=NULL; }
};
然后 g++ 说我需要一个特定的赋值运算符:
错误:非静态常量成员“const int A::v1”,不能使用默认赋值运算符
但我的赋值运算符也应该允许编辑v1。我唯一想避免的是从外部进行编辑,例如:
A a;
a.v1=10;
有没有办法实现这一点(无需创建 getter/setter 或使用指向具有所需值的新 A(int) 的指针)?
如果我将 v1 声明为 const int * 会怎样?它可以以某种方式引用某个值,但不能对其进行编辑。
【问题讨论】:
-
"没有将结构转换为类 (...)" 你所拥有的已经是一个类了。
-
你必须明白,在 C++ 中,结构是一个类,只是一个非常特定类型的类。结构是一个所有内容都是公开的类。
-
如果赋值运算符能够修改
const成员,那么您仍然会遇到从外部编辑的问题,因为我只能执行整个对象的赋值自行修改obj.v1 -
@Poodlehat:“结构是一个所有内容都是公开的类”。不,结构是默认情况下成员和基数是公共的类。结构仍然可以有私有成员。基本上你使用
struct和class并不重要,只要你保持一致,它所影响的只是你需要输入访问说明符的地方。它还会影响名称的损坏方式。 -
“我的目的是让 v1 始终不可编辑” ...“我的赋值运算符也应该允许编辑 v1”——这是你的问题,直接与要求相矛盾。选择其中一个放弃。