是否可以在C ++中仅构造特定类型的const对象?

时间:2014-02-17 16:50:53

标签: c++ c++11 constructor const

我想用以下属性实现该类:

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.


更新#1

由于我不知道答案,因此不需要严格遵循上述代码 - 任何提供类似语义的C ++模式都是受欢迎的。

4 个答案:

答案 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 );
}