我想用以下属性实现该类:
class A { ... };
const A a; // ok - should work.
A b; // compilation error - shouldn't work!
此外,如果对象的const
依赖于构造函数签名,那会更好:
const A c(1); // ok - should work.
A d("a"); // ok - should work.
A e(2); // compilation error - shouldn't work!
如果需要,允许使用C ++ 11.
由于我不知道答案,因此不需要严格遵循上述代码 - 任何提供类似语义的C ++模式都是受欢迎的。
答案 0 :(得分:5)
1.您可以使用const方法和私有成员创建类。
2.您可以创建“普通”类,但将其构造函数声明为私有。然后你需要一个朋友级的方法(或类似的东西)
class ConstClassProvider{
public:
static const A* getA(/* you can have params here*/)
{
return new A();
}
}
所以
A a1;//error
const A a2;//error
A *a3 = ConstClassProvider::getA(); //error
const A *a4 = ConstClassProvider::getA(); //ok!
答案 1 :(得分:2)
你需要创建一个不可变的类。换句话说,使用封装来防止您的类的用户设置任何字段。
基本上:
class Immutable{
private:
const int intField;
const std::string textField;
public:
Immutable(const std::string& ref, int copy) : intField{copy}, testField{ref} {}
int getIntField(){return intField;}
const std::string& getTextField(){ return textField; }
}
然后只是不要通过setter暴露你的内部。
答案 2 :(得分:1)
您可以使用额外的构造函数参数来执行此操作,该参数是对self的引用,例如:
class X {
public:
X(X const& self) {
assert(this == &self);
}
private:
X(X&);
};
然后像这样调用它:
X const x(x); // works
X y(y); // fails to compile
X z(x); // fails at run-time
答案 3 :(得分:0)
可能你正在寻找:
class AData {
public:
AData() : intValue( 0 ), stringValue( 0 ) {}
void SetInt( int arg ) { intValue = arg; }
void SetString( const char* arg ) { stringValue = arg; }
private:
int intValue;
const char* stringValue;
};
class A {
public:
A();
void Init( int intValue ) const;
void Init( const char* stringValue );
private:
AData* p;
};
A::A() : p( new AData )
{
}
void A::Init( int intValue ) const
{
p->SetInt( intValue );
}
void A::Init( const char* stringValue )
{
p->SetString( stringValue );
}