mar*_*ark 5 c++ oop copy-constructor visual-studio-2010
简而言之:是否有某种方法可以修改类定义,使得无论在何处使用它都无法在使用复制构造函数时进行编译?
我有一个非常大的项目,正在清理一些类定义.有一个类我明确地不想使用复制构造函数(让我们忽略为什么这是为了讨论),为了安全起见,我想我只是将复制构造函数定义为私有而不是实际上实现它...这样,如果我试图在任何地方使用它会抛出编译错误.瞧,它编译得很好,但我有一个链接器错误...找不到复制构造函数实现!据推测,这意味着它在某个地方使用,但我无法找到它在哪里使用.顺便说一下,这是Visual Studio 2010.所以我的问题是,有什么方法可以修改类定义,使其无法在使用点编译?
class Sample {
private:
// not implemented
Sample( const Sample& rhs );
Sample& operator=( const Sample& rhs );
public:
// implemented
Sample();
...
};
Sample *samp1 = new Sample;
Sample *samp2 = new Sample( *samp1 ); // <<-- inaccessible here! this works
Run Code Online (Sandbox Code Playgroud)
大概是因为我没有遇到编译错误,但是我遇到了链接器错误,这意味着类本身(或朋友)正在进行复制构造的创建(因为这可以访问私有构造函数),但我肯定找不到它!
在C++ 11中,您可以将定义更改为
class Sample {
private:
// not implemented
Sample( const Sample& rhs ) = delete;
Sample& operator=( const Sample& rhs ) = delete;
public:
// implemented
Sample();
...
};
Run Code Online (Sandbox Code Playgroud)
在C++ 11之前,这通常是通过从声明私有拷贝构造函数的类继承来完成的,例如boost :: NonCopyAble(你可以简单地复制这个类,它只有几行).在这种情况下,您的类(或任何朋友或孩子)也无法访问复制构造函数,它将生成编译时错误.
从不可复制的类继承:
class noncopyable
{
private:
// not implemented
noncopyable( const noncopyable& rhs );
noncopyable& operator=( const noncopyable& rhs );
};
class Sample : private noncopyable {
private:
// not implemented
Sample( const Sample& rhs );
Sample& operator=( const Sample& rhs );
public:
// implemented
Sample();
// ...
};
Sample *samp1 = new Sample;
Sample *samp2 = new Sample( *samp1 ); // <<-- compile-time error
Run Code Online (Sandbox Code Playgroud)
即使您没有C++ 11(delete其他地方提到的方法可能更可取),这也可以正常工作.
| 归档时间: |
|
| 查看次数: |
1599 次 |
| 最近记录: |